Member 14163078 Ответов: 3

Получите подробную информацию о продуктах, которые не были проданы до сегодняшнего дня.


разве я не получаю достаточный вывод по этому запросу

Что я уже пробовал:

select * from  product_table p join order_table o  on p.p_id=o.p_id  where order_date <> curdate();

Maciej Los

Пожалуйста, начните использовать форматирование.

Совет: Вы должны начать принимать ответы, которые решают ваши проблемы. Есть неписаное правило правления QA ;)

3 Ответов

Рейтинг:
2

Maciej Los

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

Например:

SELECT product_id
FROM Products
WHERE NOT IN(
   SELECT DISTINCT product_id
   FROM Orders);
-- you can add your logic about date of sale:
--   WHERE dateofsale<=curdate()
-- into subquery


Для получения более подробной информации, пожалуйста, смотрите:
MySQL :: MySQL 8.0 справочное руководство :: 13.2.11.6 подзапросы с EXISTS или NOT EXISTS[^]
MySQL :: MySQL 8.0 справочное руководство :: 12.3.2 сравнение функций и операторов: IN()[^]
MySQL :: MySQL 8.0 справочное руководство :: 12.3.2 функции сравнения и операторы: не в()[^]


Рейтинг:
0

Wastedtalent

Конечно, так и должно быть:

select * from  product_table p join order_table o  on p.p_id=o.p_id where order_date >= curdate();


Рейтинг:
0

MadMyche

Предложение в вашем запросе где order_date <> творог() собирается вернуть все детали продукта и заказа, кроме сегодняшних, потому что они не равны.
Ответ на этот вопрос состоит в том, чтобы сделать это больше или равно.

SELECT  *
FROM    product_table  p
JOIN    order_table    o  on p.p_id = o.p_id
WHERE   order_date >= curdate()             -- products and orders from today

Это будет, однако, по-прежнему содержать продукты, которые были проданы в прошлом. Поэтому следующее, что нужно сделать, - это добавить в вложенный запрос убрать продукты из прошлого. Чтобы получить идентификаторы продуктов из прошлых продаж, будет SELECT p_ID FROM order_table WHERE order_date < curdate()
и это будет добавлено в исходный запрос с помощью НЕ В пункт об их удалении
SELECT  *
FROM    product_table  p
JOIN    order_table    o  on p.p_id = o.p_id
WHERE   order_date >= curdate()             -- Products and orders from today 
AND     p.p_id NOT IN (                     -- remove products from the past
            SELECT  p_ID
            FROM    order_table
            WHERE   order_date < curdate()
       )

Теперь этот запрос даст вам все детали продукта, но он также будет содержать все детали заказа. И если было несколько покупателей одного и того же продукта, они вернут несколько строк для одного и того же продукта. Если мы хотим уменьшить это, мы удалим оператор JOIN и будем работать с ним как с подзапросом.
SELECT *
FROM   product_table p     -- Products only, no order information
WHERE  p.p_id IN (         -- Get Products sold today
         SELECT p_ID
         FROM   order_table
         WHERE  order_date >= curdate()
)
AND    p.p_id NOT IN (       -- Remove products from the past
         SELECT p_ID
         FROM   order_table
         WHERE  order_date < curdate()
)