mysql выбирают где количество = 0

В моем дб у меня есть таблица "продаж" и "sales_item". Иногда, что-то идет не так, как надо, и продажа зарегистрирована, но не объект продаж.
Таким образом, я пытаюсь получить salesID от своей таблицы "продажи", которые не имеют никаких строк в sales_item таблице.

Вот запрос mysql, я думал, будет работать, но он не делает:

SELECT s.*
FROM sales s NATURAL JOIN sales_item si
WHERE s.date like '" . ((isset($_GET['date'])) ? $_GET['date'] : date("Y-m-d")) . "%'
AND s.sales_id like '" . ((isset($_GET['shop'])) ? $_GET['shop'] : substr($_COOKIE['shop'], 0, 3)) ."%'
HAVING count(si.sales_item_id) = 0;

Какие-либо мысли?

9
задан OSdave 16 June 2010 в 10:52
поделиться

7 ответов

Откуда взялся псевдоним таблицы v? Было бы неплохо показать определение таблицы;)

Это должно быть левое соединение:

SELECT *
FROM table1
LEFT JOIN table2 ON(table1.id = table2.table1_id)
WHERE table2.table1_id IS NULL

Table1 - это ваша таблица продаж, а table2 - это ваш sales_item

15
ответ дан 4 December 2019 в 08:50
поделиться

Вам не нужно соединять таблицы, вы можете использовать что-то вроде:

[...] WHERE sales.id NOT IN (SELECT sales_id FROM sales_item)

Это фильтрует только те продажи, которые не имеют соответствующих записей sales_item.

4
ответ дан 4 December 2019 в 08:50
поделиться

Всегда используется с Группой по

GROUP BY si.sales_item_id
HAVING count(si.sales_item_id) = 0;
4
ответ дан 4 December 2019 в 08:50
поделиться

Предполагая, что каждый элемент в sales_item имеет связанный с ним sales_id, вы, вероятно, ищете все продажи, у которых нет товаров.

Как насчет использования подзапроса? Получите все sales_ids из таблицы продаж, где идентификатор не существует в таблице товаров ...

SELECT * from sales where sales_id not in (SELECT DISTINCT sales_id from sales_item)

(примечание: точный синтаксис может быть неправильным, но идея должна быть разумной, если я правильно понял вопрос)

0
ответ дан 4 December 2019 в 08:50
поделиться

Для полноты…

SELECT S.*
FROM SALES S 
WHERE NOT EXISTS (
    SELECT 1 
    FROM SALES_ITEM SI 
    WHERE SI.SALES_ITEM_ID = S.ID)

MySQL может иметь проблемы с предложениями IN.

1
ответ дан 4 December 2019 в 08:50
поделиться

Вероятно, вам следует сгруппировать строки по идентификатору товара.

SELECT s.id, count(*) as no_of_items
FROM sales s NATURAL JOIN sales_item si
WHERE s.date like '" . ((isset($_GET['date'])) ? $_GET['date'] : date("Y-m-d")) . "%'
  AND v.sales_id like '" . ((isset($_GET['shop'])) ? $_GET['shop'] : substr($_COOKIE['shop'], 0, 3)) ."%'
GROUP BY si.salesitem_id
HAVING no_of_items = 0;
0
ответ дан 4 December 2019 в 08:50
поделиться

Объединение ограничивает отображаемые строки. Мой совет - забыть об объединении и использовать вместо него что-то вроде этого:

select * из продаж where salesId not in (select salesId from sales_item)

По сути, возвращает продажи, у которых нет связанного с ними sales_item.

Удачи

0
ответ дан 4 December 2019 в 08:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: