【问题标题】:PHP/MYSQL - showing newest distinct value from multiple columnsPHP/MYSQL - 显示来自多列的最新不同值
【发布时间】:2012-12-23 01:14:25
【问题描述】:

这是我的mysql表结构:

msgid | senderid | sender | recipientid | recipient | title | message | date 

我希望在收件箱中显示我的私人消息系统,就像 Facebook 所做的那样。也就是说,无论是传入还是传出,每个对话都会从表中输出一次。例如:

My username is 'admin'.

USER   |   MESSAGE       |   DATE   |  DIRECTION
Dan    | Hello           |  1/2/10  | Incoming
Bob    | How are you Bob?|  30/1/10 | Outgoing

问题是由于方向不同,用户名不重复。例如:

USER   |   MESSAGE       |   DATE   |  DIRECTION
Dan    | Hello           |  1/2/10  | Incoming
Bob    | How are you Bob?|  30/1/10 | Outgoing
Bob    | Hi admin        |  30/1/10 | Incoming

因此,我需要确保显示的唯一消息是最新的通信,无论方向如何(即,与另一个用户的最新消息,无论该用户是“发送者”还是“接收者”)。

我在这个网站上使用 PHP/MYSQL。我已经尝试了数千种方法来做到这一点,但我就是想不通。可能是我的数据库结构不正确。我将在线几个小时(之后会不断检查),请随时提出任何问题。

【问题讨论】:

  • 您能举个例子说明您尝试过的方法吗?我说您正在寻找用户发送或接收的最新消息是否正确?
  • 是的,我正在寻找用户发送或接收的最新消息。我试过了:SELECT i.correspondent, m.subject, i.msg FROM ( SELECT sender AS correspondent, MAX(message) msg FROM mesages WHERE receiver='Daniel' GROUP BY sender UNION SELECT receiver AS correspondent, MAX(message) FROM mesages WHERE sender='Daniel' GROUP BY receiver )i, messages m WHERE i.msg=m.message;
  • (SELECT Receiver, Subject, Message ,'Sender' as 'type' FROM m WHERE Sender='Daniel' ORDER By message desc limit 1) UNION ALL (SELECT Sender, Subject, Message ,'Reciever' as 'type' FROM m WHERE Receiver='Daniel'ORDER By message desc limit 1)
  • 现在我在想这样的事情:$query = "SELECT * FROM messages WHERE sender = '$user'"; $outgoing = mysql_query($query) or die(mysql_error()); $query = "SELECT * FROM messages WHERE reciever = '$user'"; $incoming = mysql_query($query) or die(mysql_error()); while($outgoing = mysql_fetch_array($outgoing) && $incoming = mysql_fetch_array($incoming)){ 那看看哪个方向比较新?我不知道!
  • 请原谅这些文字块!

标签: mysql select private-messaging


【解决方案1】:

如果我理解正确,这应该可以满足您的需求:

SELECT
IF(senderid = :userId,recipient,sender) AS USER,
message,
date,
IF(senderid = :userId,'Outgoing','Incoming') AS DIRECTION
FROM message 
WHERE senderid = :userId OR recipientid = :userId 
ORDER BY date DESC

USER 和 DIRECTION 是根据这个用户是否是发送者来确定的。

如果您只对最新消息感兴趣,可以在此查询中添加 LIMIT。

【讨论】:

  • 谢谢吉姆!我对“传出”、“传入”有一点麻烦,我得到一个未定义的常量/意外错误。你能帮帮我吗?
  • 哦,我明白了!数据库中没有“传出”或“传入”值。这取决于用户是发件人还是收件人。会不会有问题?
  • @user1912319 是的。您应该将 :userId 替换为您正在为其获取消息的用户的 ID。
  • 我以前从未见过这样的查询。我已将 userId 更改为用户的 id,但我仍然收到相同的“意外 'Outgoing'”错误。我有一种感觉,因为在我的表格中的任何地方都没有定义“传出”和“传入”。
  • 你能发布你正在使用的代码和完整的错误信息吗?
【解决方案2】:

我已经通过以下方法解决了我自己的问题:

SELECT * FROM (
    SELECT * FROM (
         (SELECT id, reciever, recieverid, message, datetime FROM messages WHERE sender = '$user')
       UNION
          (SELECT id, sender, senderid, message, datetime FROM messages WHERE reciever = '$user')
          ) as t
       ORDER BY datetime DESC
    ) as t2
GROUP BY reciever ORDER BY datetime DESC

它似乎可以解决问题,尽管我不知道哪些消息是传入或传出的。等我有机会邀请一些实际用户时,我会知道它是否能正常工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-12
    • 1970-01-01
    相关资源
    最近更新 更多