0

好的,所以我正在为 MySQL 开发一个搜索功能,但遇到了一些我似乎无法解决的问题。我正在尝试制作一个脚本来搜索用户的朋友,并以更好的分数返回朋友。这是我到目前为止所拥有的:

SELECT id, first_name, last_name, image_id FROM users
WHERE id IN (
    SELECT receiver AS friend FROM friends WHERE initiator = :me AND status = :status        
     UNION
    SELECT initiator AS friend FROM friends WHERE receiver = :me AND status = :status
) ORDER BY score AND concat(first_name, ' ', last_name) LIKE '%test query%';

现在一切正常,直到我尝试按分数订购朋友。任何人都可以锻炼如何按分数排序朋友吗?如果您需要我澄清任何事情,请询问。

我有以下两张表。

用户表在此处输入图像描述

好友表:在此处输入图像描述

根据要求,这里是一些示例数据:

例如,我有三个用户:

ID: 1, first_name: Michael, last_name: Sample
ID: 2, first_name: John, last_name: Citizen
ID: 3, first_name: Caitlin, last_name: Wired

下面的第一个条目将通过显示 Michael 发起了一个好友请求并且 Caitlin(接收者)接受了它,从而使 Michael 和 Caitlin 成为朋友。(因此状态为 1)他们的基本分数是 10。第二个条目显示 John 也是 Caitlin 的朋友(由 Caitlin 发起),但分数更高。

ID: 10000, initiator: 1, receiver: 3, status: 1, score: 10
ID: 10001, initiator: 3, receiver: 2, status: 1, score: 20

所以在这个示例数据的情况下。如果 Caitlin 是搜索她的朋友的用户,它应该显示 John 而不是 Michael。

4

2 回答 2

3

外部语句仅从users没有列的score列中选择。几乎任何使用子选择的语句都可以(并且应该)使用连接重写。在这种特殊情况下,它将允许friends在子句中使用所有字段。

SELECT u.id, u.first_name, u.last_name, u.image_id 
  FROM users AS u
    JOIN friends AS f 
      ON ...

WHERE子选择的子句中使用的表达式成为连接条件。联合在某种意义上等同于OR(两者基本上都是连词)。

      ON    (u.id = f.receiver AND f.initiator=:me AND status=:status)
         OR (u.id = f.initiator AND f.receiver=:me AND status=:status)

声明的其余部分几乎保持原样。

  WHERE concat(first_name, ' ', last_name) LIKE '%test query%'
  ORDER BY score
;

总之就是:

SELECT u.id, u.first_name, u.last_name, u.image_id 
  FROM users AS u
    JOIN friends AS f 
      ON    (u.id = f.receiver AND f.initiator=:me AND status=:status)
         OR (u.id = f.initiator AND f.receiver=:me AND status=:status)
  WHERE concat(first_name, ' ', last_name) LIKE '%test query%'
  ORDER BY score
;

请注意,这是未经测试的,就在我的脑海中。

于 2012-12-24T05:48:14.867 回答
0
  • 你没有选择分数
  • 联合查询在外部查询中排序

例如,用于联合订购

SELECT T.* /*ANY COLUMN SET WITH(OUT) SCORE */ FROM(
 SELECT SCORE,.... FROM ANOTHERTABLE  WHERE .....
 UNION SELECT SCORE,.... FROM ANOTHERTABLE WHERE ...

) T
ORDER BY SCORE

更好的复述

SELECT id, first_name, last_name, image_id FROM users
JOIN (
SELECT score,receiver AS friend FROM friends WHERE initiator = :me AND status = :status        
 UNION
SELECT score,initiator AS friend FROM friends WHERE receiver = :me AND status = :status
) t ON T.ID = users.id ORDER BY score AND concat(first_name, ' ', last_name) LIKE '%test query%';
于 2012-12-24T05:38:33.707 回答