2015-05-29 55 views
-1

Theres是做这种查询的更好方法吗? (这是伪代码)我不知道,如果语法是好的,但这样的想法:Theres是做这种查询的更好方法吗?

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) 

我需要像这样的反应,如果我的用户是“用户ID = 17”和我的朋友用户33用户25而不是朋友:

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

我的问题是与SELECT isFromFriend场,我不想重复查询仅两次改变NOT IN并在WHERE因为真正的查询太大。

+0

那是很难理解你是什么之后,这将是更好,如果你提供一些示例数据和预期的结果了这些样本数据。 –

+0

你说得对,我编辑了第一篇文章。 –

+0

但没有好处。相反,如果您愿意,可以考虑遵循以下简单的两步操作:1.如果您尚未这样做,请提供适当的DDL(和/或sqlfiddle),以便我们可以更轻松地复制问题。 2.如果您尚未这样做,请提供与步骤1中提供的信息相对应的所需结果集。 – Strawberry

回答

3

这个伪代码是相当不可读和不方便的。更好地放置你的SQL代码。 至于我,我其实会做这样的事情。

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

所以,你会得到与FID =空行,如果没有“朋友”或FID =朋友的ID或用户ID(它是由你的数据库结构和查询),如果存在。 无论如何,我认为这些查询的表现没有什么不同(至少我不能打电话来解释它) - 这仅仅是我自己的意见和习惯。您的查询非常简洁明了。

+1

(F.id IS NOT NULL)AS isFromFriend会使原始查询的输出结果为true/false – jkavalik

2

只为Yeldar的答案增加一点点。你可以这样做:

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 

这将使你的布尔场输出

相关问题