В моем дб у меня есть таблица "продаж" и "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;
Какие-либо мысли?
Откуда взялся псевдоним таблицы v? Было бы неплохо показать определение таблицы;)
Это должно быть левое соединение:
SELECT *
FROM table1
LEFT JOIN table2 ON(table1.id = table2.table1_id)
WHERE table2.table1_id IS NULL
Table1 - это ваша таблица продаж, а table2 - это ваш sales_item
Вам не нужно соединять таблицы, вы можете использовать что-то вроде:
[...] WHERE sales.id NOT IN (SELECT sales_id FROM sales_item)
Это фильтрует только те продажи, которые не имеют соответствующих записей sales_item.
Всегда используется с Группой по
GROUP BY si.sales_item_id
HAVING count(si.sales_item_id) = 0;
Предполагая, что каждый элемент в sales_item имеет связанный с ним sales_id, вы, вероятно, ищете все продажи, у которых нет товаров.
Как насчет использования подзапроса? Получите все sales_ids из таблицы продаж, где идентификатор не существует в таблице товаров ...
SELECT * from sales where sales_id not in (SELECT DISTINCT sales_id from sales_item)
(примечание: точный синтаксис может быть неправильным, но идея должна быть разумной, если я правильно понял вопрос)
Для полноты…
SELECT S.*
FROM SALES S
WHERE NOT EXISTS (
SELECT 1
FROM SALES_ITEM SI
WHERE SI.SALES_ITEM_ID = S.ID)
MySQL может иметь проблемы с предложениями IN.
Вероятно, вам следует сгруппировать строки по идентификатору товара.
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;
Объединение ограничивает отображаемые строки. Мой совет - забыть об объединении и использовать вместо него что-то вроде этого:
select * из продаж where salesId not in (select salesId from sales_item)
По сути, возвращает продажи, у которых нет связанного с ними sales_item.
Удачи