【问题标题】:MYSQL Select As Case when number of rows statementMYSQL Select As Case when of rows 语句
【发布时间】:2012-02-05 14:06:32
【问题描述】:

我正在尝试查找每个用户的通知数量,我遇到了一个小问题,我的查询非常适合我的需要,然后我稍微改变了我的表格。

工作查询:

$numNotifications = mysql_num_rows(mysql_query("
SELECT  
      N.*, 
      P.*
      FROM 
          notifications N, 
          posts P
      WHERE 
          N.userID='$session' 
      AND 
          (
          N.action='1' OR N.action='2'
          ) 
      AND 
           N.uniqueID=P.id AND  P.state='0'"
));

但是,对于某些行,uniqueID 现在是不同的。当 N.aciton 为“1”时,N.uniqueID 应与 P.id 进行比较,但是当 N.action 为“2”时,应将该表中的一行与 P.id 进行比较。

示例查询,(应该有效,但无效)

$numNotifications = mysql_num_rows(mysql_query("
SELECT  
      N.*, 
      P.*, 
      C.*, 
     (CASE WHEN (
                  N.action = 2 AND N.state = 0
                 )
            THEN 
                 C.postID ELSE N.uniqueID END
      ) AS postId  
      FROM 
          notifications N, 
          posts P, 
          comments C 
      WHERE 
          N.userID='$session' 
      AND 
          (
          N.action='1' OR N.action='2'
          ) 
      AND 
           postId=P.id AND  P.state='0'"
));

我的 3 个表结构图:

http://i41.tinypic.com/nyzolg.png

【问题讨论】:

  • 你好 :) 你的意思是当 action=1 时,uniqueID 指向一个帖子 (P.id),当 action=2 时,uniqueID 指向一个评论 (C.id)?
  • 好吧,当action=1时,P.id和N.uniqueID是一样的。与 action=2 时相同 C.id 和 N.unique 相同,如果您按照我的设置进行操作?
  • 是的,我关注 :) 但这不是你在这个问题中写的。在您编写两次 P.id 而不是 P.id/N.id 的代码示例之间。这就是为什么我要求澄清!我相信你实际上用这个通知表让事情变得更加困难。它只保存冗余数据。
  • 我收回这一点..您跟踪两件事:1) 是否已通知用户新帖子/评论? 2) 用户是否阅读了新帖子/评论?这是正确的吗?
  • 老实说,我只是对此感到困惑,我现在正试图弄清楚我到底要做什么,哈哈。就它所拥有的数据而言,它主要是我正在构建的网站所必需的,(其中一些将在未来使用)

标签: mysql select case-when


【解决方案1】:

给你:)

SELECT
    COUNT(`notif_id`) AS `number_of_new_notifications`
FROM
    (
        SELECT
            `notifications`.`id` AS `notif_id`
        FROM
            `notifications`
        JOIN
            `posts`
        ON
            `notifications`.`uniqueID`=`posts`.`id`
        WHERE
            `notifications`.`userID`='$session'
        AND
            `notifications`.`action`=1
        AND
            `notifications`.`state`=0
        AND
            `posts`.`state`=0
        UNION ALL
        SELECT
            `notifications`.`id` AS `notif_id`
        FROM
            `notifications`
        JOIN
            `comments`
        ON
            `notifications`.`uniqueID`=`comments`.`id`
        JOIN
            `posts`
        ON
            `comments`.`postID`=`posts`.`id`
        WHERE
            `notifications`.`userID`='$session'
        AND
            `notifications`.`action`=2
        AND
            `notifications`.`state`=0
        AND
            `comments`.`state`=0
        AND
            `posts`.`state`=0
    ) AS notification_ids;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-05
    • 1970-01-01
    • 2012-09-17
    • 1970-01-01
    • 2011-06-30
    • 2013-01-07
    • 2014-03-30
    相关资源
    最近更新 更多