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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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。

如果符合以下条件,用户将无资格投票:

  • 用户是事件的所有者。
  • 用户已经投票支持该事件(在event_vote中找到用户uid和事件uid)。

以下代码......如果用户已经投票,AS投票给了我正确答案,但如果他们拥有该事件则没有。

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

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

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。这被汇总为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

看它在rextester.com上运行。

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

另一答案

您需要检查User_Event表中的voted事件是否存在User_UID。如果是,选民就是所有者。

类似的东西:(PSEUDO我不在编译器附近)

     IF EXISTS (Begin
        select User_Event_Id 
        from User_event 
        where User_UId = @user_uid 
        (@user_uid the user trying to vote) 
        and where Event_Id = @Event 
        (@Event = event of the id, the user is trying to vote for)
        End)
        Begin
        if(--Check if user has voted for event (code you already wrote)
        --User is eligible
        else
        --User not eligible
        End

    ELSE
        --User not eligible

但是,最好只花时间合并这两个请求,而不会产生if语句。

以上是关于MySQL根据找到的ID返回1或0的主要内容,如果未能解决你的问题,请参考以下文章

2021-09-11:给你一个32位的有符号整数x,返回将x中的数字部分反转后的结果。反转后整数超过 32 位的有符号整数的范围就返回0,假设环境不允许存储 64 位整数(有符号或无符号)。(代码片段

由于未找到 ID 错误的视图,列表片段未出现

Apollo Codegen 没有找到生成代码的操作或片段

解决未能加载文件或程序集“Newtonsoft.Json ...."或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配。 (异常来自 HRESULT:0x80131040)(代码片段

如何在 ViewPager 中从 Activity 移动到 Fragment?未找到片段 ID 的视图

这个代码片段究竟做了啥?