3

ネストされた IN 内で制限を使用できないことはわかっていますが、これを行う方法があると思います。方法がわかりません。

評価とコメントの両方を含む表があります (説明のために簡略化しています)


mySingleTable: +----+------------------+-----------+-----------+- ----------------+ | | ID | レビュアーコメント | is_rating | 親 ID | レビュアー評価 | +----+------------------+-----------+-----------+- ----------------+ | | 1 | よくやった 1 | 0 | 5つ星 | | | 2 | コメントAonRateA | 0 | 1 | | | | | 3 | コメントBonRateA | 0 | 1 | | | | | 4 | コメントConRateA | 0 | 1 | | | | | 5 | コメントDonRateA | 0 | 1 | | | | | 6 | コメントEonRateA | 0 | 1 | | | | | 7 | コメントFonRateA | 0 | 1 | | | | | 8 | よくやった 1 | 0 | 4つ星 | | | 9 | よくやったレートC | 1 | 0 | 5つ星 | | | 11 | よくやった 1 | 0 | 3 つ星 | | | 12 | よくやったレートE | 1 | 0 | 2 つ星 | | | 13 | よくやった 1 | 0 | 5つ星 | | | 14 | よくやった 1 | 0 | 3 つ星 | | | 15 | コメントAonRateD | 0 | 11 | | | +----+------------------+-----------+-----------+- ----------------+
したがって、
is_rating = 1 の場合、その評価です。
is_rating = 0 の場合、評価に関するコメントです (その親評価は、parent_id=id の場所です)

したがって、これは次のようになります。

よくやったレートA *****  
 コメントAonRateA  
 コメントBonRateA  
 コメントConRateA  
 コメントドンレートA  
 コメントEonRateA  
 コメントFonRateA    
よくやったレートB ****  
よくやったレートC *****  
よくできたレートD ***  
 コメントAonRateD    
よくやったレートE **  
よくやったレートF *****  
よくやったレートG ***  

私がやりたいことは、1 つのクエリのみを使用して、最新の 5 つの評価と、関連付けられた最新の 5 つのコメントを選択することです

したがって、これら2つを結合する方法は次のとおりです。

SELECT ratings.*
        FROM mySingleTable as ratings
        WHERE 
        is_rating = 1
        ORDER BY timestamp DESC LIMIT 0, 5  

    SELECT comments.*
        FROM mySingleTable as comments
        Where 
        comments.parent_id = ratings.id 
        AND is_rating = 0
        ORDER BY timestamp DESC LIMIT 0, 5

2 番目のクエリは、何らかの方法で評価クエリについて知る必要があります。

4

2 に答える 2

1

簡素化およびテスト済みのこのクエリを試してください。

SELECT *
FROM
 (SELECT *,
        IF (group_id = @prev,
            @n := @n + 1,
            @n := 1 AND @prev := group_id) as position
 FROM (
   SELECT mySingleTable.*, group_id
   FROM   mySingleTable
   INNER JOIN
       (SELECT id AS group_id
        FROM   mySingleTable
        WHERE  is_rating = 1
        ORDER BY timestamp DESC LIMIT 0, 5
       ) AS top5ratings
   ON     mySingleTable.id = group_id OR mySingleTable.parent_id = group_id
   ORDER BY group_id DESC,
            mySingleTable.parent_id ASC,
            timestamp DESC) AS all_reviews
  JOIN  (SELECT @n := 0, @prev := 0) AS setup) AS reviews
WHERE reviews.position < 7

SELECT * は悪い習慣であることに注意してください。読みやすくするために使いました。

于 2013-04-13T15:28:58.157 に答える
0

このクエリを試す

SELECT comments.*
FROM
(
SELECT ratings.id
        FROM mySingleTable as ratings
        WHERE 
        is_rating = 1
        ORDER BY timestamp DESC LIMIT 0, 5 ) AS Top5
INNER JOIN mySingleTable AS comments ON  comments.parent_id = Top5.id 
WHERE comments.is_rating = 0
ORDER BY comments.timestamp DESC LIMIT 0, 5
于 2013-04-13T14:03:18.853 に答える