我有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。但我认为这是同样的事情......
我怀疑逻辑是什么,我无法思考如何交换这些信息。
答案 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 中,您现在可以拥有朋友和使用者,但您也可以稍后添加不同的类型,而无需更改架构。而且您的查询会更直观。
同样,如果架构更改仍然是您的选项,则会出现这种情况。