0

正常に機能するこの非常に長いクエリがあります。boolean1つの要素を追加する必要があります。

編集:クエリが更新されました。以下の答えを反映しています。新しい問題:すべてのアイテムについて、各評価の行が表示されるようになりました。たとえば、4人が評価した場合、私が評価者の1人であれば、isMatched=1の1行が表示されます。他の3つはisMatched=0になります。2つのratnigがあり、私がどちらでもなかった場合、isMatchedは0を2回表示します。

   $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};");

これにもう1つ関数を追加したいと思います。これはユーザーベースのシステムであり、一部のユーザーはと呼ばれるテーブルのアイテムを評価しますratings。表の各評価には、各行の評価user_id者と一致するものもありitem_idます。WHERE上記に示されていないPHPコードでは、句 のuser_idと比較することができます。

このクエリにある種のタイプを追加して、現在ログインしているユーザーがtrue/falseと一致する booleanかどうかを示す新しい列を作成したいだけです。user_id

最終的に、私はこれをJSONで印刷し、Androidアプリ用にJavaにプッシュしています。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};");

これで、isMatched0 または 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 に答える