2010-06-15 6 views
8

В моем db у меня есть таблица «продаж» и «sales_item». Иногда что-то идет не так, и продажа записывается, но не является товаром.
Так что я пытаюсь получить salesID из таблицы «sales», у которой нет ни одной строки в таблице sales_item.mysql select where count = 0

Вот 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; 

Любые мысли?

ответ

14

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

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

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

Table1 ваш продаж-Table и table2 это вы sales_item

+0

hi tobias, v alias был опечаткой, я исправил его. Thx для вашего ответа, он отлично работает. CU вокруг – OSdave

4

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

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

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

+1

Я не использовал бы «NOT IN» из-за проблем с производительностью. Решение левого соединения, предоставляемое Тобиасом, намного лучше. – ceteras

+0

Я думаю, что он будет использовать это для временных целей отладки, но ваша точка совершенно верна :) –

0

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

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

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

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

4

Имея всегда с Группировать

GROUP BY si.sales_item_id 
HAVING count(si.sales_item_id) = 0; 
0

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

выберите * от продаж где salesId не в (выберите salesId из sales_item)

В основном, возвращает продажи, которые не имеют какой-либо связанный с этим sales_item.

Удача

0

Возможно, вы должны группировать строки по идентификатору объекта продаж.

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; 
1

Для полноты ....

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

MySQL может иметь проблемы с пунктами.