簡體   English   中英

Mysql / PHP / Smarty - 如何在一行中檢索2組不同的行?

[英]Mysql/PHP/Smarty - How can I retrieve 2 different sets of rows in one row?

我嘗試了很多不同的方法,並通過其他問題和論壇搜索,我找不到我正在尋找的東西(可能是在尋找錯誤的關鍵詞)。

無論如何,這是我的結構:

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

我需要拉出所有3個表,這對於mycars和mycars_details(每個PK只有1行)工作正常,但我的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)

請嘗試以下查詢:

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

Saurabh在他關於可能使用group concat函數的評論中包含的內容如下所示:

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;

這將為您提供拇指和鏈接列表作為單個逗號分隔值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM