使用LIKE和Union的SQL查询

时间:2012-02-15 00:39:52

标签: php mysql sql sql-like

我正在尝试生成一个朋友列表,供用户邀请参加某个活动,但前提是他们尚未参加活动或有待处理的邀请请求。

我朋友系统的工作方式,表格中有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

我将userid设置为friendID,因为此查询会生成一个列表,然后我使用复选框(其值由中确定)

然而,一旦创建了活动,如果参加活动的用户想要添加更多朋友,我需要一种方式来吸引他们的朋友,但前提是这些朋友没有参加或有待处理的请求。 我的事件表中供参加的用户的列称为acceptedInvites,待处理请求的列位于inviteRequest

所以,这是我无法开始工作的查询。如果userid位于acceptedInvitesinviteRequest,请勿选择该值

//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中的用户

活动表 使用的列是acceptedInvites inviteRequests

(第1行)acceptedInvites:“1~2”inviteRequests:“”

-userid1和userid2正在参加活动,没有待处理的邀请

基于此,如果userid1想要添加更多朋友,则只显示userid3。

1 个答案:

答案 0 :(得分:1)

我认为你的意思如下:

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

这会更好,但也不正确。你如何分离inviteRequest中的userIds?假设它们以逗号分隔,即使用户ID 3不在列表中,以下条件也会返回false

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

看到我的观点?解决这个问题的一个技巧是在inviteRequest的两边添加一个逗号,然后你会有类似的东西:

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

希望它有所帮助!