2012-10-09 54 views
1

那么,我有三个不同的表(下面检查)。我想让我可以看到,这是保存每个类别的最新图像(req_image_1等),这是不是父(cat_parent = 0)选择行的最大值为

一个表,其中包含有关请求的一般信息

+----+--------------------------+------------+ 
| id | req_name     | req_parent | 
+----+--------------------------+------------+ 
| 3 | Send pack    |   19 | 
| 4 | Go Visit     |   18 | 
| 5 | Stop by     |   19 | 
| 6 | Deliver cookies   |   34 | 
+----+--------------------------+------------+ 

二表,其中包含有关请求的

+----------+------------+------------+----------------------------+ 
| umeta_id | request_id | meta_key | meta_value     | 
+----------+------------+------------+----------------------------+ 
|  1 |   3 | req_city | London      | 
|  2 |   3 | req_street | 11 Baker street   | 
|  3 |   3 | req_img_1 | a1c8f69edb37bf6c6.jpg  | 
|  4 |   4 | req_city | Manchester     | 
|  5 |   4 | req_street | 71 Main street    | 
|  6 |   4 | req_img_2 | a71f4160d7f7f7555.jpg  | 
|  7 |   5 | req_city | Sheffield     | 
|  8 |   5 | req_street | 240 Duke street   | 
|  9 |   6 | req_city | Manchester     | 
|  10 |   6 | req_street | 13 Chapel street   | 
|  11 |   6 | req_img_1 | 854b9faaa53d8fe02.jpg  | 
+----------+------------+------------+----------------------------+ 

三表的元信息,其中包含有关类别的信息

+----+------------------------+------------+ 
| ID | cat_name    | cat_parent | 
+----+------------------------+------------+ 
| 1 | Category_01   |   0 | 
| 6 | Category_02   |   0 | 
| 18 | Category_01_01   |   1 | 
| 19 | Category_01_02   |   1 | 
| 34 | Category_02_01   |   6 | 
+----+------------------------+------------+ 

到目前为止,我管理,我能得到的所有图像为每个类别与此查询:

SELECT cat.cat_parent AS category, req.ID, meta.meta_value AS image 
FROM d_requests req 
LEFT JOIN d_requests_meta meta ON (req.ID = meta.request_id) 
LEFT JOIN d_categories cat ON (req.req_parent = cat.ID) 
WHERE meta.meta_key LIKE 'req_img_%' 

我得到了这样的结果:

+------------+----+-----------------------+ 
| category | ID | image     | 
+------------+----+-----------------------+ 
|   1 | 3 | a1c8f69edb37bf6c6.jpg | 
|   1 | 4 | a71f4160d7f7f7555.jpg | 
|   6 | 6 | 854b9faaa53d8fe02.jpg | 
+------------+----+-----------------------+ 

但是我想作的提高,所以我会只得到结果,其中每个类别只有一个图像对,例如类别1,有图像a71f4160d7f7f7555.jpg和类别6有图像854b9faaa53d8fe02.jpg

我敢打赌,我错过了一些基本的知识,简单的恩汉子查询和选择MAX的水泥将成为一种魅力。

谢谢!

+0

我完全没有时间给出完整答案,但是看起来你得到了一个[tag:most-n-per-group]问题。看看这里:http://stackoverflow.com/a/7745635/570191 –

回答

1
SELECT category, ID, image 
FROM ( SELECT cat.cat_parent AS category, req.ID, meta.meta_value AS image 
     FROM d_requests AS req 
     LEFT JOIN d_requests_meta AS meta 
     ON req.ID = meta.request_id 
     LEFT JOIN d_categories AS cat 
     ON req.req_parent = cat.ID 
     WHERE meta.meta_key LIKE 'req_img_%' 
     ORDER BY req.ID DESC) AS h 
GROUP BY category 

我编辑Clodo阿尔的答案与使用非官方MySQL的假设,即GROUP BY将返回基于在子查询ORDER BY第1行。

+0

我改变了这个答案,没有任何假设。 –

+0

谢谢,这也适用:) – Rozkalns

2

SQL Fiddle

select 
    category, 
    (select request_id 
    from d_requests_meta 
    where umeta_id = s.ID 
    ) as ID, 
    (select meta_value 
    from d_requests_meta 
    where umeta_id = s.ID 
    ) AS image 
from (
    SELECT cat.cat_parent AS category, max(meta.umeta_id) ID 
    FROM d_requests req 
    LEFT JOIN d_requests_meta meta ON (req.ID = meta.request_id) 
    LEFT JOIN d_categories cat ON (req.req_parent = cat.ID) 
    WHERE meta.meta_key LIKE 'req_img_%' 
    group by cat.cat_parent 
) s 
+0

谢谢!成功了! – Rozkalns

0

试试这个http://sqlfiddle.com/#!2/bfe9a/19

SELECT Category, ID, Image FROM (
    SELECT Category, ID, Image, 
    @id:=CASE WHEN @category <> category THEN 1 ELSE @id+1 END AS ImgRank, 
    @category:=category AS categoryTemp FROM 
    (SELECT @id:= 0) AS i, 
    (SELECT @category:= 0) AS c,  
    (
     SELECT cat.cat_parent AS category, req.ID, meta.meta_value AS image 
     FROM d_requests req 
     LEFT JOIN d_requests_meta meta ON (req.ID = meta.request_id) 
     LEFT JOIN d_categories cat ON (req.req_parent = cat.ID) 
     WHERE meta.meta_key LIKE 'req_img_%' 
     ORDER BY cat.cat_parent, req.id desc 
    ) Vw 
) vw2 WHERE IMGRANK = 1 
+0

不运行。语法错误。 –

+0

检查更新的查询丢失了FROM,但是这返回了正确的数据 –