0

私はこれを説明するのに苦労しており、これを本来よりも難しくしている可能性が非常に高いです...

基本的に、ピン/投稿で満たされたページがあり、ユーザーはそれらに賛成票または反対票を投じることができます。1 つのクエリで、ピンのリストを取得したいだけでなく、2 つのテーブルを結合して、ユーザーがそれらに賛成票を投じたか反対票を投じたかを確認したいと考えています。

テーブル構造:

pins table

|  id  |       title       |
+------+-------------------+
    1         Post 1
    2         Post 2
    3         Post 3
    4         Post 4

user_upvotes table

|  id  |  user_id  |  pin_id  |
+------+-----------+----------+
   1         1           2
   2         2           1
   3         2           3
   4         2           1

user_downvotes table

|  id  |  user_id  |  pin_id  |
+------+-----------+----------+
   1         2           2
   2         1           1
   3         1           3
   4         1           1

これが私が試したクエリですが、ページ上のピンが複製されてしまいます。

SELECT pins.id AS pin_id, title, user_upvotes.id AS upvote, user_downvotes.id AS downvote
FROM pins
LEFT JOIN user_upvotes ON user_upvotes.pin_id = pins.id AND user_upvotes.user_id = 2
LEFT JOIN user_downvotes ON user_downvotes.pin_id = pins.id AND user_downvotes.user_id = 2

これにより、次のようになります (pin_id 1 が 2 回繰り返されることに注意してください)。

| pin_id |       title       |  upvote  |  downvote  |
|   1    |       Post 1      |  (NULL)  |      2     |
|   1    |       Post 1      |  (NULL)  |      4     |
|   2    |       Post 2      |     1    |    (NULL)  |
|   3    |       Post 3      |  (NULL)  |      3     |
|   4    |       Post 4      |  (NULL)  |    (NULL)  |

この時点から、値が NULL かどうかを確認し、そうでない場合は css クラスをアタッチして、賛成票または反対票を投じたことを示します。

基本的に、ピンが複製されることなく、上記の結果が必要です。これを行うためのより良い方法があれば、それも教えてください。

4

3 に答える 3

1

GROUPBYを追加

SELECT pins.id AS pin_id, title, user_upvotes.id AS upvote, user_downvotes.id AS downvote
FROM pins
LEFT JOIN user_upvotes ON user_upvotes.pin_id = pins.id AND user_upvotes.user_id = 2
LEFT JOIN user_downvotes ON user_downvotes.pin_id = pins.id AND user_downvotes.user_id = 2
GROUP BY pin_id
于 2012-12-12T22:13:27.297 に答える
1

これはおそらく、ユーザーが同じピンに 2 回賛成票または反対票を投じたことを意味します。結果に投票の ID が含まれているため、個別の投票が個別のレコードとして取得されます。

カウントが必要か、二重投票をまったく防止したいのだと思います。カウントは次のように行われます。

SELECT 
  pins.id AS pin_id, 
  title, 
  COUNT(user_upvotes.id) AS upvotes, 
  COUNT(user_downvotes.id) AS downvotes
FROM pins
LEFT JOIN user_upvotes ON user_upvotes.pin_id = pins.id AND user_upvotes.user_id = 2
LEFT JOIN user_downvotes ON user_downvotes.pin_id = pins.id AND user_downvotes.user_id = 2
GROUP BY 
  pins.id

これで、カウントを表示したり、> 0 であるかどうかに応じて、はいまたはいいえとして表示したりできます。

于 2012-12-12T22:20:58.363 に答える
-1

これは役に立ちませんか?

 SELECT pins.id AS pin_id, title, user_upvotes.id AS upvote, user_downvotes.id AS downvote
 FROM pins
 LEFT JOIN user_upvotes ON user_upvotes.pin_id = pins.id AND user_upvotes.user_id = 2
 LEFT JOIN user_downvotes ON user_downvotes.pin_id = pins.id AND user_downvotes.user_id = 2
 **GROUP BY pins.id**
于 2012-12-12T22:14:22.337 に答える