基于找到的ID返回1或0的MySQL

基于找到的ID返回1或0的MySQL,mysql,sql,join,count,where,Mysql,Sql,Join,Count,Where,以下是相关表格的一个片段: 用户 | USER_UID | FIRSTNAME | LASTNAME | abc123 bob smith def456 rob smithies ghi789 john clark 事件 | GUID | NAME | ev1 event1 ev2 event2 ev3 event3 | US

以下是相关表格的一个片段:

用户

|  USER_UID  |  FIRSTNAME  |  LASTNAME  | 
    abc123         bob          smith
    def456         rob          smithies 
    ghi789         john         clark
事件

| GUID | NAME |  
  ev1   event1
  ev2   event2
  ev3   event3
| USER_EVENT_ID | USER_UID | EVENT_UID | 
       1            abc123     ev1
       2            def456     ev2
       3            ghi789     ev3
用户事件

| GUID | NAME |  
  ev1   event1
  ev2   event2
  ev3   event3
| USER_EVENT_ID | USER_UID | EVENT_UID | 
       1            abc123     ev1
       2            def456     ev2
       3            ghi789     ev3
投票活动

| EVENT_VOTE_ID | USER_UID | EVENT_UID | 
         1         def456      ev1       (user2 voted for user1's event)
我有以下查询,它返回带有投票数和基于此的排名的事件:

SELECT t.*, @curRank := @curRank + 1 AS rank
FROM ( SELECT e.guid,
              e.name,
              ( SELECT COUNT(ev.event_vote_id) 
                FROM event_vote ev 
                WHERE ev.event_uid = e.guid
              ) AS votes
              FROM event e
      ) AS t
CROSS JOIN (SELECT @curRank := 0) r
ORDER BY votes DESC

如果用户没有投票资格,我还想返回1或0

在下列情况下,用户没有资格投票:

  • 用户是事件的所有者

  • ,(
        SELECT COUNT(*)
        FROM event_vote ev
        WHERE ev.event_uid = e.guid
        AND ev.user_uid = '{$user_uid}'
     ) AS ineligible
    
  • 用户已为该事件投票(用户uid和事件uid可在事件\投票中找到)

如果用户已经投票,但如果他们拥有该事件,则…AS vows之后的以下代码为我提供了正确的响应

,(
    SELECT COUNT(*)
    FROM event_vote ev
    WHERE ev.event_uid = e.guid
    AND ev.user_uid = '{$user_uid}'
 ) AS ineligible
预期结果(查看所有事件时从用户的角度)


您需要检查User\u事件表中投票事件的User\u UID是否存在。如果有,投票人就是所有者

类似:(我不在编译器附近)


但是,最好只花时间合并这两个请求,而不使用result to if语句

当表达式给出1或null时,可以将此查询与大小写一起使用。这被聚合为
计数(不同的…
),仅当聚合值中至少有一个1时,该计数才为1,否则为0:

SELECT      t.*,
            @curRank := @curRank + 1 AS rank 
FROM        (
                SELECT     u.user_uid,
                           e.guid, 
                           e.name, 
                           count(ev.user_uid) votes, 
                           count(distinct 
                               case when u.user_uid in (ev.user_uid, ue.user_uid)
                                    then 1 
                               end) ineligible 
                FROM       user u
                CROSS JOIN event e
                INNER JOIN user_event ue
                        ON ue.event_uid = e.guid
                LEFT JOIN  event_vote ev
                        ON ev.event_uid = e.guid
                GROUP BY   u.user_uid, 
                           e.guid
                ORDER BY   votes desc,
                           e.guid,
                           u.user_uid
            ) as t
CROSS JOIN (SELECT @curRank := 0) r
WHERE      t.user_uid = 'def456'
ORDER BY   votes desc,
           guid, 
           user_uid
看它继续跑


请注意,当您使用这样的变量时,必须在内部查询中强制执行顺序。如果只在外部查询上执行此操作,那么就太晚了,因为变量表达式已经计算过了。不过,这可能会经常起作用,因为优化者可能会考虑到外部的
顺序,但这并不能保证。

用户已经对该事件投了票。。。你能指出这在你的数据中发生的地方吗?在event_vote表中,对不起,我现在更新它,输入错误。