我目前正在使用两张桌子。
状态:
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
我如何根据用户在朋友列表中的状态订购状态?
答案 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变量将为您保留日期和时间部分。