这是一种更好的方法来进行这种查询吗?

时间:2015-05-29 07:50:03

标签: mysql sql

这是一种更好的方法来进行这种查询吗? (它的伪代码)我不知道它的语法是否正常,但这就是这个想法:

SELECT S.*, isFromFriend = true
FROM messages AS S
WHERE id IN (SELECT id FROM friends)

UNION ALL

SELECT S.*, isFromFriend = false
FROM messages AS S
WHERE S.id NOT IN (SELECT id FROM friends)

如果我的用户是" userid = 17"我在回复时需要这样的东西。我是用户25的朋友但不是用户33的朋友:

{ "message": "hello", "userid": "25", "isFromFriend" = "true" }
{ "message": "hi!!!!", "userid": "33", "isFromFriend" = "false" }

我的问题是 SELECT isFromFriend 字段,我不想复制查询两次只更改WHERE上的NOT IN和IN,因为实际查询太大了。

2 个答案:

答案 0 :(得分:3)

这个伪代码非常难以理解且不方便。更好地放置您的SQL代码。 至于我,我实际上会做这样的事情。

SELECT S.*, F.id AS Fid
FROM messages AS S
LEFT JOIN Friends AS F
ON s.id = F.UserId

所以,如果没有'朋友'或Fid =朋友的id或用户的id(由你的数据库结构和查询决定),你会得到Fid = null的行。 无论如何,我认为这些查询的表现没有区别(至少,我不能打电话和解释) - 这只是我自己的观点和习惯。您的查询非常简洁。

答案 1 :(得分:2)

只是为耶尔达尔的回答添加一点。你可以这样做:

SELECT S.*, CASE WHEN F.id IS NULL THEN false ELSE true END AS isFriend
FROM messages AS S
LEFT JOIN Friends AS F
ON s.id = F.UserId

这将为您提供布尔字段输出