1

次のテーブルがあります: userscommentsratings、およびitems

基本的にこれを行うSQLクエリを書くことが可能かどうか知りたいです:

user_id は各テーブルにあります。SQLクエリで各テーブルの各オカレンスをカウントしたいと思います(usersもちろん例外です)。しかし、いくつかのテーブルには他のテーブルよりも重いものを載せたいと思っています。次に、「スコア」を集計したいと思います。

次に例を示します。

user_id 5 発生... アイテムで 2 回。コメントで5回。視聴率11回。

次のように合計するフォーミュラ/ポイント システムが必要です。

項目 2 x 5 = 10; コメント 5 x 1 = 5; 定格 11 x .5 = 5.5

合計 21.5

これは私がこれまでに持っているものです.....

SELECT u.users
     COUNT(*) r.user_id
     COUNT(*) c.user_id
     COUNT(*) i.user_id
FROM users as u
JOIN COMMENTS as c
     ON u.user_id = c_user_id
JOIN RATINGS as r
     ON r.user_id = u.user_id
JOIN ITEMS as i
     i.user_id = u.user_id
WHERE
    ????
GROUP BY u.user_id
ORDER by total DESC

数式部分のやり方がわかりません(可能であれば)。または合計を集計する方法。

John Woo's Answer に基づく最終コード!

$sql = mysql_query("
        SELECT  u.username,
    (a.totalCount * 5) +
    (b.totalCount) +
    (c.totalCount * .2) totalScore
    FROM users u 
    LEFT JOIN
        (
            SELECT user_id, COUNT(user_id) totalCount
            FROM items 
            GROUP BY user_id
        ) a ON a.user_id= u.user_id
    LEFT JOIN
        (
            SELECT user_id, COUNT(user_id) totalCount
            FROM comments
            GROUP BY user_id
        ) b ON b.user_id= u.user_id
    LEFT JOIN
        (
            SELECT user_id, COUNT(user_id) totalCount
            FROM ratings
            GROUP BY user_id
        ) c ON c.user_id = u.user_id
    ORDER BY totalScore DESC LIMIT 10;");
4

2 に答える 2

2

多分これはあなたを助けることができます、

SELECT  u.user_ID,
        (a.totalCount * 5) +
        (b.totalCount) +
        (c.totalCount * .2) totalScore
FROM    users u LEFT JOIN
            (
                SELECT user_ID, COUNT(user_ID) totalCount
                FROM items 
                GROUP BY user_ID
            ) a ON a.user_ID = u.user_ID
        LEFT JOIN
            (
                SELECT user_ID, COUNT(user_ID) totalCount
                FROM comments
                GROUP BY user_ID
            ) b ON b.user_ID = u.user_ID
        LEFT JOIN
            (
                SELECT user_ID, COUNT(user_ID) totalCount
                FROM ratings
                GROUP BY user_ID
            ) c ON c.user_ID = u.user_ID
ORDER BY totalScore DESC

しかし、上記のクエリに基づいて、これも機能する可能性があります

SELECT  u.users
        (COUNT(*) * .5) +
        COUNT(*) +
        (COUNT(*) * 2) totalcore
FROM users as u
        LEFT JOIN COMMENTS as c
            ON u.user_id = c_user_id
        LEFT JOIN RATINGS as r
            ON r.user_id = u.user_id
        LEFT JOIN ITEMS as i
            ON i.user_id = u.user_id
GROUP BY u.user_id
ORDER by totalcore DESC

唯一の違いは、 を使用することLEFT JOINです。すべてのテーブルに存在するとは限らないINNER JOIN可能性があるため、この状況では使用しません。user_id

これが理にかなっていることを願っています

ここに画像の説明を入力

于 2012-09-08T01:12:04.207 に答える
1

別のアプローチを次に示します。

SELECT
  u.user_id,
  SUM(s.weight) AS totalScore
FROM users u
  LEFT JOIN (
    SELECT user_id, 5.0 AS weight
    FROM items
    UNION ALL
    SELECT user_id, 1.0
    FROM comments
    UNION ALL
    SELECT user_id, 0.5
    FROM ratings
  ) s
  ON u.user_id = s.user_id
GROUP BY
  u.user_id

つまり、すべてのテーブルですべてのユーザーが発生するたびに、特定の重みを持つ行が生成されます。UNION された一連の重みは、usersその後のグループ化と集計のためにテーブルに結合されます。

于 2012-09-08T16:27:24.823 に答える