2012-01-29 2 views
1

У меня есть две таблицы Temporal_Group и Product_GroupСравните два Выбирается или таблицы в MySQL

Если я выполнить следующий запрос к таблице группы:

SELECT group.id_product FROM group 
WHERE id_group=2 

Я вернулся:

id_product 
---------------- 
5 

Теперь, если я запрашиваю временную таблицу

SELECT temporal.id_product FROM temporal 

возвращение

id_product 
---------------- 
5 
14 

Я хочу, чтобы сравнить эти 2 результатов в запросе и вернуть мне разницу ... Результат должен быть из ... Я пытался с этим:

SELECT group.id_product FROM group 
WHERE group.id_product 
NOT IN (
SELECT temporal.id_product 
FROM temporal 
WHERE group.id_product=temporal.id_product 
) 
AND group.id_group=2 

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

ответ

1

Ваша попытка возвращает разницу A-B. Я предполагаю, что вы хотите симметричную разницу (A-B) UNION (B-A):

SELECT id_product 
     , 'group' AS only_in_table 
    FROM `group` 
    WHERE id_group = 2 
     AND id_product NOT IN 
      (SELECT id_product 
      FROM temporal 
     ) 
UNION ALL 
    SELECT id_product 
     , 'temporal' AS only_in_table 
    FROM temporal 
    WHERE id_product NOT IN 
      (SELECT id_product 
      FROM `group` 
      WHERE id_group = 2 
     ) 

Это не хорошо использовать зарезервированные слова, как group к таблицам имен или столбцов, потому что вы должны как-то сказать, двигатель SQL, что это не «группа» в зарезервированном GROUP BY В MySQL это можно сделать, заключая их в обратные ссылки: `group`.

+0

Точно ответ мне нужен .... сравнение в обоих случаях, большое спасибо. извините меня ... как применить COUNT() ко всему запросу? P. S. Не волнуйтесь, я написал «группу», например ...имена моих полей длинны XD – csotelo

0
SELECT group.id_product FROM group 
WHERE id_group=2 


EXCEPT 


SELECT temporal.id_product FROM temporal 
+0

К сожалению, у MySQL нет оператора 'EXCEPT'. –

+0

Вы совершенно правы, я неправильно читаю заголовок – DonCallisto

0

Вы можете попробовать FULL OUTER JOIN.

SELECT 
    g.id_product 
FROM 
    group g 
FULL OUTER JOIN 
    temporal t 
ON 
    g.id_product = t.id_product 
WHERE 
    g.id_group = 2 AND (g.id_product IS NULL OR t.id_product IS NULL) 

Как metioned @Bill, Mysql не поддерживает полное внешнее соединение, так что вы могли бы использовать вместо union.

(SELECT 
    g.id_product 
FROM 
    group g 
LEFT JOIN 
    temporal t 
ON 
    g.id_product = t.id_product 
WHERE 
    g.id_group = 2 AND t.id_product IS NULL) 
UNION 
(SELECT 
    g.id_product 
FROM 
    group g 
RIGHT JOIN 
    temporal t 
ON 
    g.id_product = t.id_product 
WHERE 
    g.id_group = 2 AND g.id_product IS NULL) 
+1

К сожалению, MySQL не поддерживает полное внешнее соединение. –

0

Для нахождения всех предметов, которые существуют в любом другом, а не другом;

select id_product from 
    (select distinct id_product from `group` where id_group = 2 union all 
     select distinct id_product from temporal) a 
group by id_product having count(id_product)<2; 

(найти все отчетливое id_product в обеих таблицах, объединение вместе и показать все, что только показать один раз)

0

Как насчет очень простой LEFT JOIN/IS NULL. Делая соединение LEFT, он найдет эти продукты в таблице «group», где идентификатор группы = 2. Если он найдет один, g.id_product будет иметь значение ... если NOT, оно будет NULL ... набор, который вы хотите получить.

select t.id_product 
    from 
     temporal t 
     left join `group` g 
      on t.id_product = g.id_product 
      AND g.id_group = 2 
    where 
     g.id_product IS NULL 
+0

спасибо за ваш ответ, но он работает только со стороны-временной группы ... если таблица «t» имеет больше записей, чем таблица «g» ничего не возвращает. – csotelo