Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 选择成员仅属于一个客户的位置_Mysql - Fatal编程技术网

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。