2015-05-29 3 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) 

мне нужно что-то вроде этого на ответ, если мой пользователь «идентификатор = 17» и я друг пользователь 25, но не друг пользователя 33:

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

Моя проблема с поля ВЫБРАТЬ isFromFriend, я не хочу, чтобы дублировать запрос только в два раза, изменяющий NOT IN и 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 = NULL, если нет «друг» или идентификатор FID = друга или идентификатор пользователя (это до вашей структуры БД и запроса), если есть. В любом случае, я думаю, что нет никакой разницы в производительности этих запросов (по крайней мере, я не могу позвонить и объяснить) - это просто мое собственное мнение и привычка. Ваш запрос такой же компактный и простой.

+1

(F.id IS NOT NULL) AS isFromFriend сделает вывод true/false, поскольку исходный запрос был – jkavalik

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 

Это даст вам булево поле вывода

Смежные вопросы