0

我有这个很长的查询可以正常工作。我需要向boolean它添加一个元素。

编辑:查询已更新。下面反映答案。新问题:对于每个项目,它现在为每个评级显示一行。例如,如果有 4 个人评价它,如果我是评价者之一,它将显示一行 isMatched = 1;其他三个将是 isMatched = 0。如果有两个老鼠,而我都不是,isMatched 显示 0 两次。

   $result=mysql_query("
                SELECT i.item,
                    IF (ra.user_id = '{user}',1,0) AS isMatched, 
                r.ratetotal AS total,
                c.commtotal AS comments,
                r.rateav AS rate
                FROM items AS i
                LEFT JOIN master_cat AS c
                    ON (c.cat_id = i.cat_id)
                    LEFT JOIN ratings AS ra
                            ON (i.items_id = ra.item_id)
                LEFT JOIN
                    (SELECT item_id, 
                    COUNT(item_id) AS ratetotal, 
                    AVG(rating) AS rateav 
                    FROM ratings GROUP BY item_id) AS r 
                ON r.item_id = i.items_id
                LEFT JOIN
                    (SELECT item_id, 
                    COUNT(item_id) AS commtotal 
                    FROM comments GROUP BY item_id) AS c
                ON c.item_id = i.items_id
                WHERE c.category = '{$cat}'  AND i.spam < 30
                 {$order};");

我想为此添加一个更多功能。这是一个基于用户的系统,一些用户会在名为 的表中对项目进行评分ratings。表中的每个评级也会有一个user_id匹配item_id每行中的评级的人。WHERE在上面未显示的 PHP 代码中,我将与我的子句 的 user_id 进行比较。

我只是想在boolean这个查询中添加某种类型,它会在其中创建一个新列来显示user_id当前登录用户是否与真/假匹配。

最终,我以 JSON 格式将其打印出来,并推送到 Java 以获取 Android 应用程序。在应用程序中,istView如果 SQL 查询找到任何“真”匹配项,我希望 中的任何项目都显示为“粗体”。最后一点与SQL无关,我只是想解释一下应用程序。

这个查询可以这样修改吗?

4

2 回答 2

2

它可能有效:

像这样编辑 SQL 的开头:

$result=mysql_query("
            SELECT i.item,
            IF(i.user_id={$userID},1,0) AS isMatched, /* Added this line assuming you have user IDs in i.user_id column of DB and $userID var of PHP contains current user ID */
            r.ratetotal AS total,
            c.commtotal AS comments,
            r.rateav AS rate
            FROM items AS i
            LEFT JOIN master_cat AS c
                ON (c.cat_id = i.cat_id)
            LEFT JOIN
                (SELECT item_id, 
                COUNT(item_id) AS ratetotal, 
                AVG(rating) AS rateav 
                FROM ratings GROUP BY item_id) AS r 
            ON r.item_id = i.items_id
            LEFT JOIN
                (SELECT item_id, 
                COUNT(item_id) AS commtotal 
                FROM comments GROUP BY item_id) AS c
            ON c.item_id = i.items_id
            WHERE c.category = '{$cat}'  AND i.spam < 30
             {$order};");

现在,您将获得isMatched包含 0 或 1 值的结果。

于 2012-09-27T16:07:33.303 回答
1

我不相信 mysql 有一个真正的布尔类型。我通常使用 tinyInt 并设置为 0 或 1。

您可以在选择查询中使用 mysql IF 语句。假设您的用户表是 u 并且您的用户 id 字段是 user_id

 IF (u.userId = '{$user_id}', 1, 0) as user_boolean

但是,我不确定这是否真的适用于您的查询,因为您的查询正在获取聚合数据,而不是单个用户的评分。我必须有更多信息(如表格、字段和关系)才能进一步提供帮助。

于 2012-09-27T16:13:43.237 回答