Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.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_Sql_Foreign Keys_Primary Key - Fatal编程技术网

Mysql 按收件人获取线程化邮件

Mysql 按收件人获取线程化邮件,mysql,sql,foreign-keys,primary-key,Mysql,Sql,Foreign Keys,Primary Key,我有如下数据库模式: users USERNAME (PK), SEX Alex, F John, M Troy, M Matt, M messages ID (PK), CREATOR (FK users), DATE_CREATED 1, John, 2012-04-15 2, Troy, 2012-04-16 message_recipients ID, MESSAGE_ID (FK messages), RECIPIENT (FK users), DATE 1, 1, John, 2

我有如下数据库模式:

users
USERNAME (PK), SEX
Alex, F
John, M
Troy, M
Matt, M

messages
ID (PK), CREATOR (FK users), DATE_CREATED
1, John, 2012-04-15
2, Troy, 2012-04-16

message_recipients
ID, MESSAGE_ID (FK messages), RECIPIENT (FK users), DATE
1, 1, John, 2012-04-15
2, 1, Troy, 2012-04-15
3, 1, Matt, 2012-04-15
4, 2, Alex, 2012-04-16
4, 2, John, 2012-04-16
SELECT mr1.MESSAGE_ID
    FROM message_recipients mr1, message_recipients mr2
    WHERE mr1.MESSAGE_ID = mr2.MESSAGE_ID
      AND mr1.RECIPIENT = mr2.RECIPIENT
      AND 
      (
      mr2.RECIPIENT = 'John'
      OR mr2.RECIPIENT = 'Troy'
      OR mr2.RECIPIENT = 'Matt'
      )
SELECT
    m.ID AS MESSAGE_ID,
    m.CREATOR,
    mr.RECIPIENT,
    mr2.RECIPIENT
FROM
    messages AS m
    LEFT JOIN message_recipients AS mr
        ON m.ID=mr.MESSAGE_ID
        AND mr.RECIPIENT='Troy'
    LEFT JOIN message_recipients AS mr2
        ON m.ID=mr2.MESSAGE_ID
        AND mr2.RECIPIENT='Matt'
WHERE
    m.CREATOR='John'
挑战在于,我想获得一个只有John、Troy和Matt作为收件人的邮件ID

这是我的疑问:

SELECT mr1.MESSAGE_ID
FROM message_recipients mr1, message_recipients mr2
WHERE mr1.MESSAGE_ID = mr2.MESSAGE_ID
  AND mr1.RECIPIENT = mr2.RECIPIENT
  AND mr2.RECIPIENT = 'John'
  AND mr2.RECIPIENT = 'Troy'
  AND mr2.RECIPIENT = 'Matt'
上面的SQL没有显示任何结果

如果我执行此查询:

SELECT mr1.MESSAGE_ID
FROM message_recipients mr1, message_recipients mr2
WHERE mr1.MESSAGE_ID = mr2.MESSAGE_ID
  AND mr1.RECIPIENT_ID = mr2.RECIPIENT_ID
  AND (mr2.RECIPIENT_ID = 'John'
  OR mr2.RECIPIENT_ID = 'Troy'
  OR mr2.RECIPIENT_ID = 'Matt')
GROUP BY mr1.MESSAGE_ID
结果是:

MESSAGE_ID
1
2
以上结果不正确,因为我希望看到的结果只有1(MESSAGE_ID)

我做错了什么?有人能启发我吗

多谢各位,
约翰我不太确定你想要什么。但是一个专栏不能是三件事。您可以只使用语法中的
。像这样:

SELECT mr1.MESSAGE_ID
FROM message_recipients mr1, message_recipients mr2
WHERE mr1.MESSAGE_ID = mr2.MESSAGE_ID
  AND mr1.RECIPIENT = mr2.RECIPIENT
  AND mr2.RECIPIENT IN('John','Troy','Matt')
或者像这样的
语法:

users
USERNAME (PK), SEX
Alex, F
John, M
Troy, M
Matt, M

messages
ID (PK), CREATOR (FK users), DATE_CREATED
1, John, 2012-04-15
2, Troy, 2012-04-16

message_recipients
ID, MESSAGE_ID (FK messages), RECIPIENT (FK users), DATE
1, 1, John, 2012-04-15
2, 1, Troy, 2012-04-15
3, 1, Matt, 2012-04-15
4, 2, Alex, 2012-04-16
4, 2, John, 2012-04-16
SELECT mr1.MESSAGE_ID
    FROM message_recipients mr1, message_recipients mr2
    WHERE mr1.MESSAGE_ID = mr2.MESSAGE_ID
      AND mr1.RECIPIENT = mr2.RECIPIENT
      AND 
      (
      mr2.RECIPIENT = 'John'
      OR mr2.RECIPIENT = 'Troy'
      OR mr2.RECIPIENT = 'Matt'
      )
SELECT
    m.ID AS MESSAGE_ID,
    m.CREATOR,
    mr.RECIPIENT,
    mr2.RECIPIENT
FROM
    messages AS m
    LEFT JOIN message_recipients AS mr
        ON m.ID=mr.MESSAGE_ID
        AND mr.RECIPIENT='Troy'
    LEFT JOIN message_recipients AS mr2
        ON m.ID=mr2.MESSAGE_ID
        AND mr2.RECIPIENT='Matt'
WHERE
    m.CREATOR='John'
编辑

我还是不知道你想要什么。但听起来你想要这样的东西:

users
USERNAME (PK), SEX
Alex, F
John, M
Troy, M
Matt, M

messages
ID (PK), CREATOR (FK users), DATE_CREATED
1, John, 2012-04-15
2, Troy, 2012-04-16

message_recipients
ID, MESSAGE_ID (FK messages), RECIPIENT (FK users), DATE
1, 1, John, 2012-04-15
2, 1, Troy, 2012-04-15
3, 1, Matt, 2012-04-15
4, 2, Alex, 2012-04-16
4, 2, John, 2012-04-16
SELECT mr1.MESSAGE_ID
    FROM message_recipients mr1, message_recipients mr2
    WHERE mr1.MESSAGE_ID = mr2.MESSAGE_ID
      AND mr1.RECIPIENT = mr2.RECIPIENT
      AND 
      (
      mr2.RECIPIENT = 'John'
      OR mr2.RECIPIENT = 'Troy'
      OR mr2.RECIPIENT = 'Matt'
      )
SELECT
    m.ID AS MESSAGE_ID,
    m.CREATOR,
    mr.RECIPIENT,
    mr2.RECIPIENT
FROM
    messages AS m
    LEFT JOIN message_recipients AS mr
        ON m.ID=mr.MESSAGE_ID
        AND mr.RECIPIENT='Troy'
    LEFT JOIN message_recipients AS mr2
        ON m.ID=mr2.MESSAGE_ID
        AND mr2.RECIPIENT='Matt'
WHERE
    m.CREATOR='John'

我不太确定你想要什么。但是一个专栏不能是三件事。您可以只使用
语法中的
。像这样:

SELECT mr1.MESSAGE_ID
FROM message_recipients mr1, message_recipients mr2
WHERE mr1.MESSAGE_ID = mr2.MESSAGE_ID
  AND mr1.RECIPIENT = mr2.RECIPIENT
  AND mr2.RECIPIENT IN('John','Troy','Matt')
或者像这样的
语法:

users
USERNAME (PK), SEX
Alex, F
John, M
Troy, M
Matt, M

messages
ID (PK), CREATOR (FK users), DATE_CREATED
1, John, 2012-04-15
2, Troy, 2012-04-16

message_recipients
ID, MESSAGE_ID (FK messages), RECIPIENT (FK users), DATE
1, 1, John, 2012-04-15
2, 1, Troy, 2012-04-15
3, 1, Matt, 2012-04-15
4, 2, Alex, 2012-04-16
4, 2, John, 2012-04-16
SELECT mr1.MESSAGE_ID
    FROM message_recipients mr1, message_recipients mr2
    WHERE mr1.MESSAGE_ID = mr2.MESSAGE_ID
      AND mr1.RECIPIENT = mr2.RECIPIENT
      AND 
      (
      mr2.RECIPIENT = 'John'
      OR mr2.RECIPIENT = 'Troy'
      OR mr2.RECIPIENT = 'Matt'
      )
SELECT
    m.ID AS MESSAGE_ID,
    m.CREATOR,
    mr.RECIPIENT,
    mr2.RECIPIENT
FROM
    messages AS m
    LEFT JOIN message_recipients AS mr
        ON m.ID=mr.MESSAGE_ID
        AND mr.RECIPIENT='Troy'
    LEFT JOIN message_recipients AS mr2
        ON m.ID=mr2.MESSAGE_ID
        AND mr2.RECIPIENT='Matt'
WHERE
    m.CREATOR='John'
编辑

我还是不知道你想要什么。但听起来你想要这样的东西:

users
USERNAME (PK), SEX
Alex, F
John, M
Troy, M
Matt, M

messages
ID (PK), CREATOR (FK users), DATE_CREATED
1, John, 2012-04-15
2, Troy, 2012-04-16

message_recipients
ID, MESSAGE_ID (FK messages), RECIPIENT (FK users), DATE
1, 1, John, 2012-04-15
2, 1, Troy, 2012-04-15
3, 1, Matt, 2012-04-15
4, 2, Alex, 2012-04-16
4, 2, John, 2012-04-16
SELECT mr1.MESSAGE_ID
    FROM message_recipients mr1, message_recipients mr2
    WHERE mr1.MESSAGE_ID = mr2.MESSAGE_ID
      AND mr1.RECIPIENT = mr2.RECIPIENT
      AND 
      (
      mr2.RECIPIENT = 'John'
      OR mr2.RECIPIENT = 'Troy'
      OR mr2.RECIPIENT = 'Matt'
      )
SELECT
    m.ID AS MESSAGE_ID,
    m.CREATOR,
    mr.RECIPIENT,
    mr2.RECIPIENT
FROM
    messages AS m
    LEFT JOIN message_recipients AS mr
        ON m.ID=mr.MESSAGE_ID
        AND mr.RECIPIENT='Troy'
    LEFT JOIN message_recipients AS mr2
        ON m.ID=mr2.MESSAGE_ID
        AND mr2.RECIPIENT='Matt'
WHERE
    m.CREATOR='John'

我认为你应该使用
而不是

请尝试以下内容:

SELECT mr1.MESSAGE_ID
FROM message_recipients mr1 LEFT JOIN message_recipients mr2 
ON mr1.MESSAGE_ID = mr2.MESSAGE_ID
WHERE  mr1.RECIPIENT = mr2.RECIPIENT
  AND ( mr2.RECIPIENT = 'John'
  OR mr2.RECIPIENT = 'Troy'
  OR mr2.RECIPIENT = 'Matt')

我认为你应该使用
而不是

请尝试以下内容:

SELECT mr1.MESSAGE_ID
FROM message_recipients mr1 LEFT JOIN message_recipients mr2 
ON mr1.MESSAGE_ID = mr2.MESSAGE_ID
WHERE  mr1.RECIPIENT = mr2.RECIPIENT
  AND ( mr2.RECIPIENT = 'John'
  OR mr2.RECIPIENT = 'Troy'
  OR mr2.RECIPIENT = 'Matt')
试试看-

SELECT mr1.MESSAGE_ID
FROM message_recipients mr1, message_recipients mr2
WHERE mr1.MESSAGE_ID = mr2.MESSAGE_ID
  AND mr1.RECIPIENT = mr2.RECIPIENT
  AND mr2.RECIPIENT = 'John'
  AND mr2.RECIPIENT in ('Troy','Matt')
试试看-

SELECT mr1.MESSAGE_ID
FROM message_recipients mr1, message_recipients mr2
WHERE mr1.MESSAGE_ID = mr2.MESSAGE_ID
  AND mr1.RECIPIENT = mr2.RECIPIENT
  AND mr2.RECIPIENT = 'John'
  AND mr2.RECIPIENT in ('Troy','Matt')

我也试过,但结果也是“2”。不是我想要的。你能更新问题并提供你期望的结果吗?我已经更新了问题和我期望的结果。谢谢你的回复。谢谢阿里奥,我已经用你的上一篇文章作为指导,来得到我想要的结果。没问题。很乐意帮忙@用户1302607:记住对你认为好的答案投赞成票。这给了我们一种温暖的模糊感觉:PI也尝试过这个,但结果也是“2”。不是我想要的。你能更新问题并提供你期望的结果吗?我已经更新了问题和我期望的结果。谢谢你的回复。谢谢阿里奥,我已经用你的上一篇文章作为指导,来得到我想要的结果。没问题。很乐意帮忙@用户1302607:记住对你认为好的答案投赞成票。这给了我们一种温暖而模糊的感觉:尝试使用左连接而不是简单连接。尝试此处发布的查询尝试使用左联接而不是简单联接。请尝试在此处发布查询