2014-11-26 3 views
0

Эй MYSQL вопрос здесь:Mysql INNER JOIN и HAVING COUNT

У меня есть 3 таблицы, назовём их пунктов, статьи и order_point, которые выглядят примерно так (в упрощенном виде):

item = |item_id|article_id|, 
article = |article_id|article_info|, 
order_point=|op_id|article_id|op_amount| 

Таблица items содержит физические элементы, которые хранятся (одна строка на физический элемент). В таблице статей содержится информация о каждом типе физического элемента, а в order_point (количество) указано, сколько из каждой статьи должно храниться в магазине в любое время.

Теперь то, что я хотел бы сделать, это получить каждый article_id, в котором хранится меньше предметов, чем order_point_amount.

Так что я хочу что-то вроде этого:

SELECT article_id 
FROM item INNER JOIN order_point 
ON (item.article_id = order_point.article_id GROUP BY item.article_id 
HAVING COUNT(item)<order_point.op_amount) 

Приведенный выше код не действует, хотя и это последние минуты рабочего дня так что давайте посмотрим, если кто-то решает эту проблему, прежде чем я завтра!

РЕДАКТИРОВАТЬ: Проблема в запросе, как будто это то, что order_point.op_amount неизвестно в условии наличия.

+1

Вы не 'group by' –

+0

Такая же проблема с группой, вам не требуется в MYSQL, насколько я читал. Во всяком случае, я включу его. – dansv130

+0

, вы должны задать вопрос, используя http://sqlfiddle.com/ с надлежащим вводом и ожидаемым выходом. –

ответ

0

Предполагая, что вы присоединяетесь на столбах, без дублей, что является очень распространенный случай:

Внутреннее соединение А и В дает результат пересекались B, то есть внутренняя часть диаграммы Венна пересечения ,

Внешнее соединение A и B дает результаты объединения A B, то есть внешних частей союза диаграммы Венна.

Примеры

Предположим, у вас есть две таблицы, с одной колонке каждой, и данные следующим образом:

A B 
- - 
1 3 
2 4 
3 5 
4 6 

Заметим, что (1,2) являются уникальными для A, (3,4) являются общими, и (5,6) являются уникальными для В.

Inner присоединиться

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

select * from a INNER JOIN b on a.a = b.b; 
select a.*,b.* from a,b where a.a = b.b; 

a | b 
--+-- 
3 | 3 
4 | 4 

левое внешнее соединение

Левое внешнее соединение передаст все строки в плюс какие-либо общие строки в B.

select * from a LEFT OUTER JOIN b on a.a = b.b; 
select a.*,b.* from a,b where a.a = b.b(+); 

a | b 
--+----- 
1 | null 
2 | null 
3 | 3 
4 | 4 

Полное внешнее объединение

полное внешнее объединение даст вам объединение A и B, т. е. все строки в A и все строки в B. Если что-то в A не имеет соответствующей базы данных в B, то часть B равна нулю, и наоборот.

select * from a FULL OUTER JOIN b on a.a = b.b; 

a | b 
-----+----- 
    1 | null 
    2 | null 
    3 | 3 
    4 | 4 
null | 6 
null | 5 

Я надеюсь, что это решит вашу проблему! Хорошего дня!

0

Я решил так:

SELECT * 
FROM order_point 
INNER JOIN (SELECT item.article_id, COUNT(*) AS in_store 
      FROM item INNER JOIN order_point 
      ON item.article_id = order_point.article_id 
      GROUP BY item.article_id) AS TEMP 
ON order_point.article_id = TEMP.article_id 
WHERE TEMP.in_store<order_point.amount 
GROUP BY order_point.article_id 

Это дает мне строки с меньшим количеством элементов в магазине чем запрошенный сумму, которая является тем, что я был после.