SQL-запрос с использованием LIKE и Union - PullRequest
0 голосов
/ 15 февраля 2012

Я пытаюсь создать список друзей, чтобы пользователи могли пригласить их на мероприятие, но только в том случае, если они еще не посещают мероприятие или ожидающий запрос на приглашение.

Как работает система моих друзей, в таблице 3 столбца. userid1, userid2 и friendstatus. Пользователь, отправивший запрос, переходит в столбец 1 (userid1), пользователь, получивший запрос, переходит в столбец 2 (userid2). Поскольку пользователь, создавший событие, может находиться в любом столбце, я использую следующий запрос при добавлении друзей в событие.

//this block is finding friends from column1
SELECT userid1 as friendID 
FROM friends 
WHERE userid2 = $myUsername AND friendstatus = 1
UNION 
// this section is finding friends from column 2
SELECT userid2 as friendId 
FROM friends 
WHERE userid1 = $myUsername AND friendstatus = 1

Я установил идентификатор пользователя в качестве FriendID, потому что этот запрос генерирует список, для которого я затем использую флажки (из которых определяется значение)

Однако, как только событие будет создано, если посещающие его пользователи захотят добавить больше друзей, мне нужен способ вывести своих друзей, но только в том случае, если эти друзья не имеют права посещать или имеют ожидающий запрос. Столбец в моей таблице событий для посещаемых пользователей называется acceptedInvites, а столбец для ожидающих запросов - inviteRequest.

Итак, вот запрос, который я не могу получить на работу. Если userid находится в acceptedInvites или inviteRequest, НЕ выбирайте это значение

//this section is finding friends from column1
SELECT 
    events.inviteRequest, 
    events.acceptedInvites, 
    friends.userid1 as friendID 
FROM friends 
LEFT JOIN events on 
    friends.userid1 NOT LIKE '%events.inviteRequest%' AND 
    friends.userid1 NOT LIKE '%events.acceptedInvites%'
WHERE friends.userid2 = $userid AND friends.friendstatus = 1 
UNION 
//this section is finding friends from column 2
SELECT users.userid2 as friendId 
FROM friends 
LEFT JOIN events on 
    friends.userid2 NOT LIKE '%events.inviteRequest%' AND 
    friends.userid2 NOT LIKE '%events.acceptedInvites%'
WHERE friends.userid1 = $userid AND friends.friendstatus = 1 

Например:

стол друзей столбцы: friend1, friend2 и friendstatus

(строка 1) userid1: 1 userid2: userid2 friendstatus: 1

(строка 2) userid1: 3 userid2: 1 friendstatus: 1

-userid1 дружит с userid1 и userid3. Как я уже говорил выше, пользователь в userid1

таблица событий Используемые столбцы принимаются. Приглашения приглашают

(строка 1) acceptInvites: "1 ~ 2" InviteRequests: ""

-userid1 и userid2 присутствуют на мероприятии, приглашений нет в ожидании

Исходя из этого, если userid1 хочет добавить больше друзей, появится только userid3.

1 Ответ

1 голос
/ 15 февраля 2012

Я думаю, вы имели в виду следующее:

events.inviteRequest NOT LIKE '%' + friends.userid1 + '%'

Это было бы лучше, но и не правильно. Как вы разделяете идентификаторы пользователей в вашем inviteRequest? Предполагая, что они разделены запятыми, следующее условие возвращает false, хотя ID пользователя 3 отсутствует в списке:

'23,35,35' NOT LIKE '%3%'

Видишь мою точку зрения? Хитрость, чтобы исправить это, это добавить запятую к обеим сторонам inviteRequest, тогда у вас будет что-то вроде:

',23,35,35,' NOT LIKE '%,3,%'  -- Note the commas around 3.

Надеюсь, это поможет!

...