【问题标题】:How can I select and order rows from one table based on values contained in another?如何根据另一个表中包含的值从一个表中选择和排序行?
【发布时间】:2015-01-10 01:01:35
【问题描述】:

我目前正在处理两个表。

状态:

id INT(4) AUTO_INCREMENT
username VARCHAR(20)
text LONGTEXT
datetime VARCHAR(25)
attachment VARCHAR(11)
timestamp VARCHAR(50)

朋友:

id INT(2) AUTO_INCREMENT
added INT(1)
userto VARCHAR(32)
userfrom VARCHAR(32)

我想添加一个选项,让用户只过滤他们朋友的状态,并首先显示最新的状态。我的意思是最近的状态,而不是每个朋友的最新状态,我怀疑可以这样做:

ORDER BY status.id DESC

如何根据好友列表中用户的状态对状态进行排序?

【问题讨论】:

  • 按用户排序?实际查询 + 预期结果会很好
  • 我不知道如何编写查询,这就是我问的原因。另外,我在我的问题中解释了预期的结果。预期结果是查看它的用户的朋友的所有状态。 SELECT * FROM status, friends WHERE status.username = friends.userto AND friends.userto = '$username' OR status.username = friends.userfrom AND friends.userfrom = '$username' ORDER BY id DESC LIMIT $page, 15 就我所知,但它只返回查看所述过滤器的人的状态。我想更多地学习如何在 SQL 中使用多个表,但现在我想要这个功能。
  • 按“实际结果”我要表格内容。例如,显示两个表中的 3-5 行,然后显示您希望看到的结果(使用示例数据)。
  • @DoctorSatan 虽然我建议尝试一下我的答案,但我会在上面将您的答案更改为status.username = friends.userto AND friends.userto = '$username'status.username = friends.userto AND friends.userfrom = '$username' 和另一个虎钳。想一想,如果您要加入 userto,并且用户名是该列,那么您将获得该用户。您希望一列代表用户,另一列代表朋友。

标签: mysql join


【解决方案1】:

好吧,如果没有任何样本数据,肯定很难做到这一点,但我会以这种方式进行。

我们想要显示的状态(无论顺序如何)是用户的好友状态。那么,让我们以Adam的朋友为例:

SELECT DISTINCT userto
FROM friends
WHERE userfrom = 'Adam'
UNION
SELECT DISTINCT userfrom
FROM friends
WHERE userto = 'Adam';

此时,我应该指出,在您的朋友表中,用户名是 VARCHAR(32),而在状态表中,它们是 VARCHAR(20),我认为它们应该是相同的。

所以,现在您可以根据用户名是否在上述子查询中来过滤状态,并且您可以按 id 降序排列,假设您按顺序添加它们,但最好的方式将按状态的时间戳排序:

SELECT *
FROM status
WHERE username IN 
   (SELECT DISTINCT userto
   FROM friends
   WHERE userfrom = 'Adam'
   UNION
   SELECT DISTINCT userfrom
   FROM friends
   WHERE userto = 'Adam')
ORDER BY datetime DESC;

编辑

我还会重新考虑日期时间和时间戳的变量,以及重新考虑名称。虽然这些是有效的,但它们也是保留字(DATETIME 和 TIMESTAMP 是 MySQL 中的数据类型)。您的状态表的可能重建可能是:

id INT(4) AUTO_INCREMENT
username VARCHAR(32)
statusText LONGTEXT
statusPostDate DATETIME
attachment VARCHAR(11)

DATETIME 变量将为您保存日期和时间部分。

【讨论】:

    【解决方案2】:

    试试这个

    SELECT      status.*
    FROM        status
    JOIN        friends
    ON          status.username = friends.userto
    WHERE       friends.userfrom = '$username'
    UNION
    SELECT      status.*
    FROM        status
    JOIN        friends
    ON          status.username = friends.userfrom
    WHERE       friends.userto = '$username'
    ORDER BY    status.id DESC;
    

    此查询从包含 $username 的友谊关系两端的用户名加载状态。联合用于从上到下粘合两个列表。 Join 用于将两个列表并排粘合在一起,并将它们与作者的用户名对齐。

    【讨论】:

    • 我不认为在没有任何解释的情况下复制和粘贴查询会帮助那些因困惑而选择提问的人。
    • 很公平,我已经添加了解释
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-27
    • 1970-01-01
    • 1970-01-01
    • 2017-02-11
    • 2020-07-28
    • 2020-02-16
    • 2021-03-27
    相关资源
    最近更新 更多