同一列上的2个INNER JOIN的SQL不起作用

时间:2014-12-19 18:47:42

标签: mysql sql sql-order-by inner-join

我正在尝试使用以下代码来获取当前用户最近聊过的6个用户。我有两个问题。首先,如果当前用户已收到来自其他用户但仅发送的消息,则不提取该其他用户。其次,ORDER BY子句导致错误。我是SQL的初学者,所以我不知道发生了什么。 在此先感谢!

以下是代码:

SELECT users.* 
FROM users INNER JOIN
    messages fromuser 
    ON (fromuser.fromid = users.id) INNER JOIN
    messages touser 
    ON (touser.toid = users.id)
WHERE fromuser.toid = :userid OR touser.fromid = :meid
GROUP BY users.id
ORDER BY MAX(messages.datetime)
LIMIT 6;

2 个答案:

答案 0 :(得分:0)

你的逻辑注定要失败,因为一个users.id不能同时是两个不同的值。我认为这个查询可以满足您的需求:

SELECT u.* 
FROM messages m INNER JOIN
     users u
     ON (m.fromid = u.id AND m.toid = :userid) OR
        (m.toid = u.id AND m.fromid = :userid )
GROUP BY u.id
ORDER BY MAX(m.datetime) DESC
LIMIT 6;

请注意,它不是当前用户users加入id表。

答案 1 :(得分:0)

这应该可以完成你的工作,到目前为止,它比你的其他答案更少依赖MySQL扩展。我估计它会有相同的表现,但它确实更有说服力。

SELECT u.* 
FROM (
  SELECT DISTINCT otherid
  FROM (
    SELECT
       m.fromid AS otherid,
       MAX(m.datetime) as maxts
    FROM messages m
    WHERE m.toid = :userid
    GROUP BY m.fromid

    UNION ALL

    SELECT
      m.toid AS otherid,
      MAX(m.datetime) as maxts
    FROM messages m
    WHERE m.fromid = :userid
    GROUP BY m.toid
  ) um
  ORDER BY maxts DESC
  LIMIT 6
) otheru
INNER JOIN users u
  ON u.id = otheru.otherid