1

サブクエリにネストされたLIMITなしで次のクエリを使用する場合

SELECT   `c`.*, 
         GROUP_CONCAT(g.photo SEPARATOR "|") AS `photos_list` 
  FROM   `contests` AS `c` 
              LEFT JOIN 
                  (
                      SELECT   `gallery`.`contest_id`, 
                               `gallery`.`photo` 
                        FROM   `gallery`
                   ) AS `g` ON c.id = g.contest_id 
GROUP BY `c`.`id`

すべて正常に動作します

id   title    photos_list 

1    title1   50026c35632eb.jpg
2    title2   50026ac53567f.jpg|50026ac5ec82e.jpg|500e71557270f....

お団子にLIMITを追加すると、「photos_list」が1行だけに表示されます。次のクエリ

SELECT   `c`.*, 
         GROUP_CONCAT(g.photo SEPARATOR "|") AS `photos_list` 
  FROM   `contests` AS `c` 
              LEFT JOIN 
                  (
                      SELECT   `gallery`.`contest_id`, 
                               `gallery`.`photo` 
                        FROM   `gallery`
                       LIMIT    0, 2
                   ) AS `g` ON c.id = g.contest_id 
GROUP BY `c`.`id`

戻ります

id  title   photos_list 

1   title1  NULL
2   title2  50026ac46ea05.jpg|50026ac53567f.jpg

id = 1のアイテムには、が含まれている必要がありますが、含まれphotos_listていません。LIMITは、 id=2のアイテムに対して機能することに注意してください。

正しい結果を得るにはどうすればよいですか?

4

5 に答える 5

2

photo_date > gsub.photo_dateタイムスタンプ (例: AND ) またはより複雑な基準を使用して同様のことを行うことができます。唯一の注意点は、すべてが条件に一致する行が複数ある場合 (たとえば、複数の写真のタイムスタンプが同一である場合)、それらすべてが含まれることです。そのためphoto_id、おそらくユニークな を選択しました。

次のように元のクエリに挿入します。

SELECT c.id, c.title,
       GROUP_CONCAT(g.photo SEPARATOR "|") AS photos_list
FROM   contests AS c
  LEFT JOIN (
    //put query from above here
  ) AS g 
ON c.id = g.contest_id  GROUP BY c.id
于 2012-12-10T16:03:04.930 に答える
2
SELECT   `c`.*, 
     GROUP_CONCAT(g.photo SEPARATOR "|") AS `photos_list` 
FROM   `contests` AS `c` 
          LEFT JOIN 
              (
                  SELECT   `gallery`.`contest_id`, 
                           `gallery`.`photo` 
                    FROM   `gallery`
               ) AS `g` ON c.id = g.contest_id 
GROUP BY `c`.`id`

GROUP_CONCAT を次のように変更します。

SUBSTRING_INDEX(GROUP_CONCAT(g.photo SEPARATOR "|"),'|',2) AS `photos_list` 
于 2012-07-24T13:33:25.970 に答える
1

特定のコンテストの写真のセットのうち、どの 2 枚を返却するかをどのように決定しますか? それはランダムなものであることを意味していますか?それとも、最新の 2 枚の写真ですか、それとも最も評価の高い 2 枚の写真ですか、それとも他の基準ですか? 写真を選ぶ条件を設定できれば、後は簡単です。このクエリは、各コンテスト ID の photo_id が最も高い 2 つの写真を取得します。

     SELECT contest_id, photo, photo_id
       FROM gallery gsub
       WHERE (
         SELECT COUNT(*) FROM gallery 
           WHERE contest_id=gsub.contest_id //for each category
           AND photo_id > gsub.photo_id 
       ) < 2 //if number of photo_ids > than this photo_id < 2, keep this photo
       ORDER BY contest_id

AND photo_date > gsub.photo_dateタイムスタンプ (例: ) またはより複雑な基準を使用して同様のことを行うことができます。唯一の注意点は、すべてが条件に一致する行が複数ある場合 (たとえば、複数の写真のタイムスタンプが同一である場合)、それらすべてが含まれることです。そのため、一意であると思われる photo_id を選択しました。

次のように元のクエリに挿入します。

SELECT c.id, c.title,
           GROUP_CONCAT(g.photo SEPARATOR "|") AS photos_list
    FROM   contests AS c
      LEFT JOIN (
        //put query from above here
      ) AS g 
    ON c.id = g.contest_id  GROUP BY c.id 
于 2012-07-25T12:02:46.590 に答える
1

これも同様に機能します。ただし、別の SELECT 句をラップしないと、コンテスト用の写真がない場合、コンテストは表示されません。

SELECT c.*, GROUP_CONCAT(g.photo SEPARATOR "|") AS photo_list
FROM 
  contests c 
LEFT JOIN
  (SELECT *, @num:= if(@contest = contest_id, @num + 1,1) as row_num,
             @contest := contest_id as c_id
   FROM gallery
   ORDER BY contest_id) AS g
ON c.id = g.contest_id
WHERE g.row_num <= 2
GROUP BY c.id, c.title
于 2012-07-24T13:04:28.220 に答える
1

SELECT c.*, ((
  SELECT GROUP_CONCAT(temp.photo SEPARATOR "|")
  FROM (SELECT photo FROM gallery g WHERE c.id = g.contest_id LIMIT 2) temp
)) AS photo_list
FROM contests c

間違った回答で申し訳ありません。次の解決策が最適であると言っているわけではありませんが、少なくとも機能します。galleryところで、この新しいソリューションでは、テーブルに という名前の主キーがあると仮定しましidた。

SELECT c.*, GROUP_CONCAT(g.photo SEPARATOR "|") AS photos_list
FROM contests AS c
LEFT JOIN (
    SELECT
        g_0.*
    FROM (
        SELECT
            g_1.*
            , ((SELECT COUNT(*) FROM gallery g_2 WHERE g_2.contest_id = g_1.contest_id AND g_2.id <= g_1.id)) AS i
        FROM gallery g_1
    ) g_0
    WHERE
        g_0.i <= 2
) g ON (c.id = g.contest_id)
GROUP BY c.id
于 2012-07-24T13:59:56.257 に答える