Mysql 选择成员仅属于一个客户的位置
我很难想出一个问题。我有三张桌子Mysql 选择成员仅属于一个客户的位置,mysql,Mysql,我很难想出一个问题。我有三张桌子 messages --------------- message_id phone_num body received_time subscribers --------------- phone_num keyword_id keywords --------------- keyword_id client_id 订阅者可以属于不同客户端的许多关键字。我想查找属于一个特定客户机但不属于其他客户机的订阅者的最新消息,因此总共只有一个客户机 例如,查找来自
messages
---------------
message_id
phone_num
body
received_time
subscribers
---------------
phone_num
keyword_id
keywords
---------------
keyword_id
client_id
订阅者可以属于不同客户端的许多关键字。我想查找属于一个特定客户机但不属于其他客户机的订阅者的最新消息,因此总共只有一个客户机
例如,查找来自仅属于客户端1的订阅者的最新消息,其中包含以下数据:
message_id phone_num body received_time
1 111 hi 123456
2 222 test 123489
3 333 msg 213445
phone_num keyword_id
111 1
111 2
222 3
333 4
333 5
keyword_id client_id
1 1
2 1
3 1
4 1
5 4
我想得到:
message_id phone_num body received_time
2 222 test 123489
1 111 hi 123456
因为数字111和222只属于一个客户机
有道理吗?我想不出来。感谢在一个具有相同模拟数据的数据库中,此查询对我有效。这可能不会很快,但会完成任务
SELECT m.* FROM messages m
WHERE m.phone_num IN (
SELECT DISTINCT s.phone_num FROM subscribers s, keywords k
WHERE s.keyword_id = k.keyword_id
AND k.client_id = ???
AND NOT EXISTS (
SELECT ki.client_id FROM keywords ki, subscribers si
WHERE ki.keyword_id = si.keyword_id
AND si.phone_num = s.phone_num
AND ki.client_id <> k.client_id
)
)
我构建了这个复杂的查询:
SELECT
m.message_id, m.phone_num, m.body, m.received_time
FROM
messages m
WHERE m.phone_num IN (
SELECT
phone_num
FROM
subscribers s,
keywords k
WHERE
s.keyword_id = k.keyword_id AND
k.client_id = 1 AND
s.phone_num IN (
SELECT
s.phone_num
FROM
subscribers s, keywords k
WHERE
s.keyword_id = k.keyword_id
GROUP BY s.phone_num
HAVING COUNT(DISTINCT k.client_id) = 1
)
)
最内部的子查询获取唯一的编号,例如,只属于一个客户机的编号
中间的内部子查询只获取这些数字中属于所需客户机注释k.client_id=1的数字
最后,外部查询获取消息,这些号码可以在电话列表中找到
关于性能的注意事项:如果在client_id字段上放置索引,中间子查询就可以了。最内部的查询有点问题,因为它检查表中所有的关键字行。表中的行的大小/数量如何
希望它能对您有所帮助。您的两个查询对我都不起作用,它们冻结了服务器。不知道为什么,可能索引不好。但我找到了一个运行非常快的查询
SELECT DISTINCT m.message_id AS unique_id, m.phone_num, m.body, m.system_time
FROM messages m
JOIN subscribers s ON m.phone_num = s.phone_num
JOIN keywords k ON s.keyword_id = k.keyword_id
WHERE m.phone_num NOT
IN (
SELECT s.phone_num
FROM subscribers s, keywords k
WHERE k.client_id != 'XXXX'
AND k.keyword_id = s.keyword_id
)
ORDER BY m.system_time DESC
谢谢你的帮助,如果有人能改进我的查询,请做 我看到了订阅者和关键字之间的关系,但消息和其他两个表之间没有关系。显然是电话号码列。是的,对不起,是电话号码,但我如何将消息发送到特定的客户端?例如,我希望来自仅属于客户机23的订阅者的所有消息发送到客户机23。我已将该子句添加到查询中。只是替换???使用您感兴趣的客户ID。