MySQL 根据找到的 ID 返回 1 或 0

这是有问题的表的片段:

用户

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

事件

| GUID | NAME |  
  ev1   event1
  ev2   event2
  ev3   event3

USER_EVENT

| USER_EVENT_ID | USER_UID | EVENT_UID | 
       1            abc123     ev1
       2            def456     ev2
       3            ghi789     ev3

EVENT_VOTE

| 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。

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

  • 用户是事件的所有者。

  • 用户已经为该事件投票(用户 uid 和事件 uid 可在 event_vote 中找到)。

如果用户已经投票,则...AS 投票后的以下代码给了我正确的响应,但如果他们拥有该事件,则不会。

,(
    SELECT COUNT(*)
    FROM event_vote ev
    WHERE ev.event_uid = e.guid
    AND ev.user_uid = '{$user_uid}'
 ) AS ineligible

预期结果(从用户 2 秒的角度查看所有事件)

guid: ev1
name: event1
votes: 1 
rank: 1
ineligible: 1 (already voted).

guid: ev2
name: event2
votes: 0
rank: 2
ineligible: 1 (user owns this event)

guid: ev3
name: event3
votes: 0 
rank: 3
ineligible: 0 (user doesn't own this event and has yet to vote).
特里科特

您可以将此查询与case when给出 1 或null. 这被聚合为 a count(distinct ...),仅当聚合值中至少有一个 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

reextester.com上查看它的运行情况

请注意,当您使用这样的变量时,您必须强制内部查询中的顺序如果您只在外部查询上执行此操作,那么它真的来得太晚了,因为变量表达式已经被评估了。虽然它可能经常工作,因为优化器可能会考虑到外部order by,但不能保证。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章