如何根据另一个表中包含的值从一个表中选择和排序行?

时间:2014-11-13 00:48:31

标签: mysql join

我目前正在使用两张桌子。

状态:

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

我如何根据用户在朋友列表中的状态订购状态?

2 个答案:

答案 0 :(得分:0)

试试这个

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的友谊关系的任一端的用户名加载状态。 Union用于从上到下粘合两个列表。 Join用于将两个列表并排粘贴,并将它们与作者的用户名对齐。

答案 1 :(得分:0)

嗯,没有任何样本数据肯定会很难做到这一点,但我会这样做。

我们想要显示的状态(无论顺序如何)是用户与之交友的状态。所以,让我们得到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变量将为您保留日期和时间部分。