2

itemspurchases、およびの3 つのテーブルがありcollaboratorsます。ユーザーは、アイテムを所有したり、アイテムを購入したり、アイテムのコラボレーターになることができます。さらに、購入したアイテムは、評価を上げたり+1、下げたりすることができます-1。所有者または共同編集者は、自分のアイテムを購入できません。

特定のユーザーのすべてのアイテムを取得し、各アイテムの評価も表示したいと思います。

ここに私のテーブルがあります:

      items           |           purchases           |     collaborators
i_id  item_id user_id | p_id item_id  user_id  rating |c_id item_id user_id
  1      1       11   |  1      1         13     -1   |  1     1        12 
  2      2       12   |  2      2         11      1   |  2     2        13
  3      3       13   |  3      3         12     NULL |    
                      |  4      1         14     -1   |

これまでのMYSQLクエリは次のとおりです。

select *, count(p_id) as tots, sum(rating=1) as yes, sum(rating= '-1') as no
from items
left join purchases
on items.item_id=purchases.item_id
left join collaborators
on items.item_id=collaborators.item_id
where items.user_id=13 or purchases.user_id=13 or collaborators.user_id=13
group by items.item_id

これが私の予想される結果ですuser_id=11(句のそれぞれ user_idを変更する):WHERE

item_id    tots  yes no
  1         2     0   2
  2         1     1   0
// notice how user_id=11 doesn't have anything to do with item_id=3

の期待される結果は次のuser_id=12とおりです。

item_id    tots  yes no
  1         2     0   2
  2         1     1   0    
  3         1     1   0  

の期待される結果は次のuser_id=13とおりです。

item_id    tots  yes no
  1         2     0   2
  2         1     1   0    
  3         1     1   0   
//notice user_id=13 should have same results as user_id=12. Although, their 
relation to each of the 3 items is different, they still either purchased, 
own, or collaboratored on each of them.

残念ながら、最初の 2 つの結果は得られましたが、 の正しい結果ではありませんuser_id=13。なんらかの理由で、私には理解できませんuser_id=13, item_id=1tots=1tots=2

「これは2つのクエリに分けたほうがいい」など、ご意見いただければ幸いです。

4

1 に答える 1

1

あなたが正しいことを理解しているかどうかはまだ完全にはわかりませんが、次のステートメントを試して、そこから作業を進めてください。

編集

次のステートメントは、期待される結果を返します。これは、 (SQL Server を使用して)こちら で
確認できます。

これの要点は、

  • 3 つのテーブルから考えられるすべての user_id と item_id の組み合わせを選択します
  • 各アイテムのカウント/評価を選択します
  • 結果を組み合わせる

SQL ステートメント

SELECT u.user_id, pt.item_id, pt.cnt, pt.yes, pt.no
FROM   (
        SELECT user_id, item_id, title FROM items 
        UNION SELECT user_id, item_id, NULL FROM purchases
        UNION SELECT user_id, item_id, NULL FROM collaborators      
       ) u INNER JOIN (
        SELECT COUNT(*) AS cnt
               , SUM(CASE WHEN ISNULL(rating, 1) = 1 THEN 1 ELSE 0 END) AS yes
               , SUM(CASE WHEN rating =-1 THEN 1 ELSE 0 END) AS no
               , item_id
        FROM   purchases
        GROUP BY
               item_id
      ) pt ON pt.item_id = u.item_id    

MYSQL ステートメント

SELECT u.user_id, pt.item_id, pt.cnt, pt.yes, pt.no, u.title
FROM   (
    SELECT user_id, item_id, title FROM items where user_id=13
    UNION SELECT user_id, item_id, NULL FROM purchases where user_id=13
    UNION SELECT user_id, item_id, NULL FROM collaborators where user_id=13       
   ) u INNER JOIN (
    SELECT COUNT(*) AS cnt
           , SUM(rating=1) AS yes
           , SUM(rating =-1) AS no
           , item_id
    FROM   purchases 
    GROUP BY
           item_id
  ) pt ON pt.item_id = u.item_id 
于 2012-06-20T19:14:52.953 に答える