检查值存在且两个表之间不存在

时间:2017-04-11 21:49:36

标签: mysql sql

我有3张桌子,一张是帐户,一张是朋友,另一张是消费者。 像这样:

table_accounts

id | account_name

table_friends

id | account_id | people_id

table_consumers

id | account_id | people_id

我需要传达以下信息:

哪个consumer_id在两个表中共存,简单如下:

SELECT 
    *  
FROM
    table_friends,
    table_consumers
WHERE
    table_friend.account_id = 12345
    AND table_friend.account_id = table_consumers.account_id
GROUP BY table_friend.people_id

此查询非常慢

好吧,我现在需要获取consumer_id的friends表,它们不在consumer表中。在第三个时刻,找出friends表中不存在哪个consumer_id。但我认为这是同样的事情......

我怀疑逻辑是什么,我无法思考如何交换这些信息。

4 个答案:

答案 0 :(得分:2)

这可能或多或少是你尝试做的事情:(并看看Subqueries with EXISTS vs IN - MySQL

SELECT *
FROM table_friends
WHERE
    NOT EXISTS (
        SELECT *
        FROM table_consumers
        WHERE table_consumers.people_id = table_friends.people_id
        )
顺便说一句,你说"这个查询非常慢"你查询了多少行?什么是"慢" ?你有需要的索引吗?

答案 1 :(得分:1)

你可以这样做:

Select a.account_name
, a.id
, case when f.id is null then 0 else 1 end isFriend
, case when c.id is null then 0 else 1 end isConsumer
from table_accounts a
left join table_friends f on a.id = f.account_id
left join table_consumers c on a.id = c.account_id

答案 2 :(得分:1)

如果我正确理解您的问题,您可以使用NOT IN查找每个表的例外情况。像这样:

SELECT id  
FROM table_consumers  
WHERE account_id  
NOT IN 
  (SELECT account_id 
   FROM table_friends)

您可以对表格名称进行相同的操作,以找出哪些朋友不在消费者中。如果您想在查询中包含多个表,则可能还需要使用UNION或UNION ALL进行检出。请参阅:UNION ALL and NOT IN together

答案 3 :(得分:1)

看起来您已经获得了如何撰写查询的答案,但您应该考虑重新设计架构。如果还不晚。

table_friends和table_consumers都代表人。唯一的区别是什么类型/种类的人。每次需要向人们添加新属性时,您都不想添加新表。 你需要的是:

table_accounts
table_people
table_people_type
table_people_type_mapping 

最后一个是 table_people table_people_type 之间的映射表。 在 table_people_type 中,您现在可以拥有朋友使用者,但您也可以稍后添加不同的类型,而无需更改架构。而且您的查询会更直观。

同样,如果架构更改仍然是您的选项,则会出现这种情况。