Сравните два выбора или таблицы в MySQL - PullRequest
1 голос
/ 29 января 2012

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

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

SELECT group.id_product FROM group
WHERE id_group=2

Я вернул:

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

Теперь, если я сделаю запрос к временной таблице

SELECT temporal.id_product FROM temporal

return

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

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

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

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

Ответы [ 5 ]

1 голос
/ 29 января 2012

Ваша попытка возвращает разницу 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 голосов
/ 29 января 2012

Как насчет очень простого LEFT JOIN / IS NULL. Выполнив LEFT-соединение, он найдет те продукты в таблице 'group', где ID группы = 2. Если он найдет один из них, g.id_product будет иметь значение ... если НЕТ, то будет 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 голосов
/ 29 января 2012

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

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 голосов
/ 29 января 2012

Вы можете попробовать 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)

Как отмечалось @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)
0 голосов
/ 29 января 2012
SELECT group.id_product FROM group
WHERE id_group=2


EXCEPT


SELECT temporal.id_product FROM temporal
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...