1

以下のように結合したままの2つのテーブルがあり、IDごとに追加されたパッドを降順で表示しています。これは正常に機能します。

SELECT p.* FROM ruj_users_pad 
AS p LEFT JOIN ruj_users
AS u ON p.user_id = u.id 
WHERE u.status !=0 
AND 1 
AND p.status = 1 
GROUP BY p.added_date
DESC LIMIT 0, 20

ただし、ここで、「added_date」列として前のクエリと組み合わせて新しい降順を表示する3番目のテーブルを取得したいと思います。3番目のテーブルのデータは、ユーザーがクリックしてパッド上の現在のアイテムをお気に入りに追加したときにボタンから生成されます。

これが私が持っているものですが、機能していません。

SELECT p.*,f.added_date FROM ruj_users_pad
AS p LEFT JOIN ruj_users 
AS u ON b.user_id=u.id 
LEFT JOIN ruj_users_fave 
AS f ON f.brag_id = u.id 
WHERE u.status !=0 
AND 1 
AND p.status = 1 
GROUP BY f.added_date DESC, b.added_date DESC 
LIMIT 0, 20

結果は最初の結果と同じものを返します。何が悪いのかわかりません。ruj_users_faveにエントリがあることを考慮した結果を、最初の結果と組み合わせて、お気に入りのパッドを一番上に表示したいと思います。

ヘルプは大歓迎です。

4

1 に答える 1

1

UNIONこれは、 2つのサブクエリをマージするために使用する問題の解決策です。これは、3つのテーブルの完全なクエリではなく、概念を示すための2つのテーブルの本質にすぎません。私はテーブルpadとテーブルを使用しますlikes。最初のサブクエリは、と一緒にid使用してパッドとその最新の「いいね」を選択します。列の名前をに変更していることに注意してください。MAXGROUP BY idMAX(liked)timestamp

SELECT pad.id, MAX(liked) AS timestamp FROM
pad INNER JOIN likes WHERE likes.pad_id = pad.id
GROUP BY pad.id

もう1つのサブクエリはid、まだ高く評価されていないパッドを選択します。つまり、その特定のパッドのlikesテーブルにレコードが存在しませんid。この場合、返されるレコードの順序を決定するためにパッドの作成日を使用する必要があることに言及します。したがって、名前をに変更addedtimestampます。

SELECT id, added AS timestamp FROM pad
WHERE NOT EXISTS
  (SELECT liked FROM likes WHERE likes.pad_id = pad.id)

idパッドとを返す2つのサブクエリがあるtimestampので、を使用してそれらを1つの結果セットに結合しUNION、次にORDERそれを使用できBY timestampます。結合されたクエリは次のようになります。

SELECT combined.id, combined.timestamp FROM
(
  SELECT pad.id, MAX(liked) AS timestamp FROM
    pad INNER JOIN likes WHERE likes.pad_id = pad.id
    GROUP BY pad.id
  UNION
  SELECT id, added AS timestamp FROM pad
    WHERE NOT EXISTS
      (SELECT liked FROM likes WHERE likes.pad_id = pad.id)
)
combined ORDER BY combined.timestamp DESC;
于 2013-01-08T00:16:30.313 に答える