0

さまざまな方法を試し、他の質問やフォーラムを検索しましたが、探しているものが見つかりません (間違ったキーワードを検索している可能性があります)。

とにかく、ここに私の構造があります:

mycars 
--car_id (pk)
--make
--model
mycars_details
--car_id (pk)
--option1
--option2
mycars_gallery
--car_id (pk)
--imgcount
--imglink
--imgthumb

mycars と mycars_details (PK ごとに 1 行しかない) では正常に機能する 3 つのテーブルすべてをプルする必要がありますが、mycars_gallery には 1 台の車に対して 3 つの行 (画像) があります。ユーザーは、1 台の車に対して最大 12 枚の画像をアップロードできます。

したがって、このSQLを実行すると:

SELECT * FROM mycars c 
LEFT OUTER JOIN mycars_gallery g 
ON c.car_id = g.car_id 
LEFT OUTER JOIN mycars_details d 
ON c.car_id = d.car_id 
WHERE c.status = 1 AND c.car_id = 27

出力:

|car_id|make|model|option1|option2|imgcount|imglink  |imgthumb   |
  --------------------------------------------------------------
|  27  |volk|jetta|   1   |   0   |   1    |link1.jpg|thumb1.jpeg|
|  27  |volk|jetta|   1   |   0   |   2    |link2.jpg|thumb2.jpeg|
|  27  |volk|jetta|   1   |   0   |   3    |link3.jpg|thumb3.jpeg|

だから私は他のテーブルからこれらすべての重複を取得します。このデータを smarty 配列に保存し、smarty ループを使用してページに吐き出します。

このようなもの:

{section name=car loop=$SHOW_ARRAY}
    {$SHOW_ARRAY[car].make} - {$SHOW_ARRAY[car].model}<br>

    {$SHOW_ARRAY[car].imglink}
{/section}

質問:クエリが間違っているように感じます。データベース (mycars_gallery tbl) にすべての画像が保存されている 1 台の車を取得するにはどうすればよいですか?

4

2 に答える 2

1

次のクエリを試してください。

SELECT c.car_id,c.make,c.model, d.option1, d.option2,
MAX(CASE WHEN G.IMGTHUMB = 'thumb1.jpg' THEN G.IMGTHUMB ELSE 0 END) AS T1,
MAX(CASE WHEN G.IMGTHUMB = 'thumb2.jpg' THEN G.IMGTHUMB ELSE 0 END) AS T2,
MAX(CASE WHEN G.IMGTHUMB = 'thumb3.jpg' THEN G.IMGTHUMB ELSE 0 END) AS T3
FROM mycars c 
Inner JOIN mycars_gallery g 
ON c.car_id = g.car_id 
Inner JOIN mycars_details d 
ON c.car_id = d.car_id 
WHERE c.car_id = 27;

デモを参照してください: http://sqlfiddle.com/#!2/3e90b/13

また、可能な代替手段は、mysql で group_concat() 関数を使用することです。

MySQL で作業していると仮定しています。同じことを達成するには、次の一般化されたクエリを使用してください。

SET @sql = NULL;
SELECT 
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'max(case when g.imgthumb = ''',
      G.IMGTHUMB,
      ''' then g.imgthumb else 0 end) AS `',
      IMGTHUMB, '`'
    )
  ) INTO @sql
FROM  mycars c 
Inner JOIN mycars_gallery g 
ON c.car_id = g.car_id 
Inner JOIN mycars_details d 
ON c.car_id = d.car_id 
WHERE c.car_id = 27;

SET @sql = CONCAT('select c.car_id,c.make,c.model, d.option1, d.option2, ', @sql, ' 
                  from mycars c 
                  Inner JOIN mycars_gallery g 
                  ON c.car_id = g.car_id 
                  Inner JOIN mycars_details d 
                  ON c.car_id = d.car_id 
                  WHERE c.car_id = 27');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

データセットで利用可能な画像をできるだけ多く実行できるはずです。動作するフィドルはhttp://sqlfiddle.com/#!2/449638/25にあります。

于 2013-08-02T13:16:06.260 に答える
1

group concat 関数を使用する可能性について Saurabh がコメントに含めた内容は、次のようになります。

SELECT c.*, 
  GROUP_CONCAT(g.imglink) AS links,
  GROUP_CONCAT(g.imgthumb) AS thumbs
FROM mycars c 
LEFT OUTER JOIN mycars_gallery g 
ON c.car_id = g.car_id 
LEFT OUTER JOIN mycars_details d 
ON c.car_id = d.car_id 
WHERE c.status = 1 AND c.car_id = 27
GROUP BY c.car_id;

これにより、サムとリンクのリストがカンマ区切りの値として表示されます。

于 2013-08-02T13:35:40.903 に答える