@Leatington

Как осуществить выборку по данным из другой таблицы?

Есть таблица продуктов (products), где есть AUTO_INCREMENT поле (id), а также поле с названием продукта (name) и идентификатором производителя (serial), как вы понимаете, от одного производителя может быть несколько продуктов.

Ещё есть таблица отметок (spent), куда можно занести некачественный продукт, записывается уникальный идентификатор продукта (id с первой таблицы - product) и время занесения (issued).

Сейчас при выборке продуктов некачественным помечается только занесённый продукт, а нужно, чтобы отмечались все продукты производителя, при том изменять базу данных, чтобы заносить в таблицу идентификатор производителя - не вариант.

Нужно сделать, чтобы при выборке абсолютно все продукты от этого производителя среди других были помечены.

Сейчас мой запрос таков:

SELECT distinct `products`.`id`, `products`.`name`, `products`.`serial`, `spent`.`issued` as `spent` from `products` left join `spent` on `products`.`id` = `spent`.`product`
  • Вопрос задан
  • 155 просмотров
Решения вопроса 1
@alexalexes
Если хоть один из продуктов производителя будет занесен в некачественные, то этот запрос для любого продукта этого производителя будет выводить spent = 1.
SELECT distinct p1.`id`,
 p1.`name`, 
 p1.`serial`, 
 case
  when (select count(*)
  from `products` as p2
   join `spent`  as s2 on p2.`id` = s2.`product`
                                     and s2.`issued` = 1 -- какое значение в качестве некачественного продукта ?
 where p2.`serial` = p1.`serial`) > 0
  then 1
  else 0
   end as `spent` 
from `products` as p1
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
rozhnev
@rozhnev Куратор тега MySQL
Fullstack programmer, DBA, медленно, дорого
Можно импользовать следующий подход:
Снфчала выберем производителей бракоделов:
select distinct manufacturer
    from spent s
    join products p on p.id = s.product_id;


Потом присоединим таблиуц бракоделов к таблице продуктов используя LEFT JOIN:
select 
    products.*, 
    case when bad_manufacturers.manufacturer is null then 'Хороший производитель' else 'Бракодел' end manufacturer_rate
from products
left join (
    select distinct manufacturer
    from spent s
    join products p on p.id = s.product_id
) bad_manufacturers using (manufacturer)


https://sqlize.online/sql/mysql80/f55574001241f544...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы