如何检查多个表中是否存在类似的值

时间:2014-05-18 11:30:00

标签: php mysql database

我已经阅读并回顾了这里(以及其他地方)有关如何执行此操作的大量帖子,但我的结果似乎是从有意义的事情开始倒退。

我有4个表具有不同的列/数据,但我需要选择的列是相同的并具有相同的结构。

Table 1: | id | item_id | user | other table 1 specific columns...<br>
Table 2: | id | item_id | user | other table 2 specific columns...<br>
Table 3: | id | item_id | user | other table 3 specific columns...<br>
Table 4: | id | item_id | user | other table 4 specific columns...<br>

我正在尝试检查1个查询中的所有4个表中是否存在特定的user / item_id组合,而不是4个。

如果我正确阅读所有帖子,我应该在SELECT语句之间执行UNION ALL,但是,我实际上正在改变那些有意义的内容。

为了简单起见,我只是用表1和表2来测试它。

表1没有我正在寻找的组合。

表2确实有我正在寻找的组合。

SELECT item_id AS table1ID
FROM table1
WHERE item_id=35 AND user='usernamehere'
UNION ALL
SELECT item_id AS table2ID
FROM table2
WHERE item_id=35 AND user='usernamehere'

所以,我期待看到的是表1中的null结果和表2中item_id的结果,但是发生的事情是我从表2中得到的结果和表中的“命中”都没有结果1。

由于表1实际上没有包含item_id = 35和user ='usernamehere'的记录,因此看起来倒退并且令人困惑。

非常感谢任何建议或见解。

3 个答案:

答案 0 :(得分:1)

您的查询只是在特定表格中列出item_id。它没有具体说明它们的来源。对于两个表,您可以使用join解决问题。

我认为对于更多的表格,你会想要这样的东西:

select item_id, group_concat(which order by which) as tables
from ((select item_id, user, 'table1' as which from table1) union all
      (select item_id, user, 'table2' from table1) union all
      (select item_id, user, 'table3' from table1) union all
      (select item_id, user, 'table4' from table1)
     ) t
where user = 'usernamehere'
group by item_id;

对于每个item_id,这将列出它所在的表。如果您想要所有四个表中的项目。然后添加having子句:

having count(distinct which) = 4;

同样,如果您想要一个或多个缺失的示例:

having count(distinct which) < 4;

答案 1 :(得分:0)

假设$ var有你的搜索字段:

select
    inp.ID,
    count(t1.itemID) as TableOne,
    count(t2.itemID) as TableTwo,
    count(t2.itemID) as TableThree,
    count(t3.itemID) as TableFour
from
    (
        select
            ".$var." as ID
        from
            dual
    ) inp
    left outer join
        table1 t1
            on inp.ID=t1.item_id
    left outer join
        table2 t2
            on inp.ID=t1.item_id
    left outer join
        table3 t3
            on inp.ID=t1.item_id
    left outer join
        table4 t4
            on inp.ID=t1.item_id
group by
    inp.ID

这将通过您创建的选择以及您可以很好地计算的其他表的外部联接来计算项目是否在您的表中。

答案 2 :(得分:0)

UNION将合并结果(行),我不认为它是你需要的。

考虑使用JOIN语句:

SELECT exTable.ID

FROM exTable as t1

JOIN t2 as t2 ON t1.col = t2.col // we have value of col in t2 same as in t1
JOIN t3 as t3 ON t1.col = t3.col 
JOIN t4 as t4 ON t1.col = t4.col

WHERE t1.ID = 35 AND t1.user = 'usernamehere'

在某些情况下,您可以使用LEFT或RIGHT联接,您可以在W3C上阅读它们。