条件に当てはまるレコードをランダムで、1レコードのみLEFT JOINしたい

ORDER BY RAND()後にGROUP BYできないので大変。

  1. ORDER BY RAND()状態で一時テーブルを作る
  2. LEFT JOIN時にGROUP BYする

でOK。

  • テーブル
    • place
      • 場所テーブル
    • place_comment
      • 場所へのコメント情報テーブル
      • image_pathを持ち、nullでないレコードをJOINしたい
    • tmp_place_comment
      • 一時テーブル
/* 一時テーブル作成 */
CREATE TEMPORARY TABLE IF NOT EXISTS tmp_place_comment
(
    id__place   INTEGER       UNSIGNED  NOT NULL,
    image_path  VARCHAR(255)  BINARY
) ENGINE=InnoDB DEFAULT CHARSET=UTF8 COLLATE=UTF8_UNICODE_CI;

/* 一時テーブルにオリジナルテーブルの内容を乱順でコピー */
INSERT INTO tmp_place_comment
SELECT
id__place,
image_path
FROM place_comment
WHERE '' != image_path  /* image_pathが空のレコードを弾く */
ORDER BY RAND();

/* セレクト */
SELECT
place.*,
A.image_path
FROM place
LEFT JOIN( SELECT * FROM tmp_place_comment GROUP BY id__place ) AS A
ON place.id = A.id__place
WHERE id__country = $id__country; /* ちゃんとエスケープしてね */