0

我尝试了许多不同的方法并搜索了其他问题和论坛,但我找不到我正在寻找的东西(可能正在搜索错误的关键字)。

无论如何,这是我的结构:

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 有 3 行(图像)用于 1 辆车。用户最多可以为 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)

4

2 回答 2

1

Saurabh 在他关于可能使用组 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;

这将为您提供作为单个逗号分隔值的拇指和链接列表。

于 2013-08-02T13:35:40.903 回答
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 回答