比较mysql中的两个选择或表

时间:2012-01-29 14:47:57

标签: mysql compare

我有两张表 Temporal_Group Product_Group

如果我对组表执行以下查询:

SELECT group.id_product FROM group
WHERE id_group=2

我回来了:

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

现在,如果我查询时态表

SELECT temporal.id_product FROM temporal

返回

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

我想在查询中比较这两个结果并将差异返回给我...结果应该是 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 个答案:

答案 0 :(得分: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`

答案 1 :(得分:0)

SELECT group.id_product FROM group
WHERE id_group=2


EXCEPT


SELECT temporal.id_product FROM temporal

答案 2 :(得分: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)

正如@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)

答案 3 :(得分: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,联合在一起并显示只显示一次的所有内容)

答案 4 :(得分:0)

如何非常简单的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