繁体   English   中英

如何根据一个表中的值选择另一个表中的行并对其排序?

[英]How can I select and order rows from one table based on values contained in another?

我目前正在使用两个表。

状态:

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      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用于并排粘贴两个列表,并使它们与作者的用户名对齐。

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

我们想要显示的状态(与顺序无关)是用户与之成为朋友的状态。 因此,让我们以Adam的朋友为例:

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

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

因此,现在您可以根据用户名是否在上述子查询中来过滤状态,并且可以假设ID按顺序添加, 可以按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变量将为您同时保留日期和时间部分。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM