1

私は次のクエリを持っています:

'SELECT * FROM posts LEFT JOIN taxi ON taxi.taxiID = posts.postID
    WHERE (taxi.value = 1 AND taxi.userID ='.$userID.') 
    AND ??????????????
    ORDER BY taxi.ID DESC
    LIMIT 10'

サイトの仕組みは、ユーザーが投稿に「いいね」のタグを付けることができることです。投稿が高く評価されると、タクシーテーブルに新しい行が与えられます。taxiIDはpostIDと同じで、userIDは投稿を高く評価したユーザーを格納し、value1に設定されます。投稿を嫌うvalueと0に設定されます。

valueが1で、userID$userID-チェックのすべての投稿を表示したい。ただし、ユーザーがまだ投稿を高く評価していないすべての投稿をクエリに表示することも必要です。ユーザーがまだ投稿を高く評価していない場合はuserIDNULL対応するvalueが。になりNULLます。それを照会すると、他のユーザーが気に入ったが、ユーザーが気に入っていない投稿はスキップされます。

表は次のtaxiとおりです。

ID    taxiID    userID    value
1     1         1         1
2     1         6         1
3     1         4         0
4     2         1         0
5     2         6         1
6     2         4         0
7     3         6         1
8     3         4         0

1であると仮定する$userIDと、私のクエリはtaxiID1と3を表示するはずです(ユーザー1がID1を好きで、3を好きまたは嫌いではなかったため) taxiID

私が投稿したコードでは、taxiID1のみが表示されます。

問題は、上記で与えられるはずのクエリの欠落している行は何ですか?

4

3 に答える 3

3

taxiID使用が嫌いではないことをすべて見つけたいようです。

SELECT taxiID 
FROM taxi
GROUP BY taxiID
HAVING taxiID NOT IN 
      ( SELECT taxiID
        FROM taxi 
        WHERE userID = '.$userID.'
          AND value = 0
      )
ORDER BY taxiID DESC
LIMIT 10

SQLでテスト-フィドル


あなたはおそらくpostテーブルを持っているので、以下を使用する方が良いでしょう:

SELECT *                               --- whatever columns from `post` table
FROM post
WHERE postID NOT IN                     
      ( SELECT taxiID
        FROM taxi 
        WHERE userID = '.$userID.'
          AND value = 0
      )
ORDER BY postID 
LIMIT 10

taxi.taxiIDそれがを意味する場合はpostID、名前をに変更する必要がありますtaxi.postID。そのままでは非常に紛らわしいです。

于 2012-04-18T23:55:31.473 に答える
1

私はこれをコメントとして持っていましたが、それが私の最終的な答えだと思います:

SELECT * FROM posts 
LEFT JOIN taxi ON taxi.taxiID = posts.postID
WHERE (taxi.value != 0 AND taxi.userID ='.$userID.') 
OR taxi.value is null
ORDER BY taxi.ID DESC
LIMIT 10

さて、これは上記のクエリで起こるはずです:

  1. すべての投稿を取得
  2. タクシーテーブルから情報を追加し、postIDによってタクシーデータを投稿データに関連付けます
  3. taxi.valueが0でない場合(nullまたは1になる可能性があることを意味します)、およびuserIDが変数と同じである場合にのみ表示します
于 2012-04-19T00:37:08.557 に答える
0

taxi.taxiIDがpost.IDと同じであり、ユーザーによってまだタグ付けされていないすべての投稿を選択しようとしていると仮定して、次のことを試してください。

SELECT * FROM post WHERE ID NOT IN
(SELECT taxiID FROM taxi WHERE userID = 1)

もちろん、これはID=1のユーザー向けです。

于 2012-04-19T00:01:32.377 に答える