2014-03-24 52 views
0

我有一個行程表和一個關聯的圖像與外鍵的表。我想獲得其第一個圖像行程的列表,以便通過排序與1MySQL左連接右表有命令和限制

CREATE TABLE itineraries (
    id int(10) AUTO_INCREMENT, 
    is_live tinyint(1), 
    title varchar(255), 
    body text, 
    PRIMARY KEY (id) 
) 

CREATE TABLE itineraries_images (
    id int(10) AUTO_INCREMENT, 
    itineraries_id int(10), 
    is_live tinyint(1), 
    caption varchar(255), 
    image_src varchar(255), 
    sort smallint(5), 
    PRIMARY KEY (id), 
    KEY itineraries_id (itineraries_id) 
) 

我做了左連接的限制訂貨itineraries_images,但它不排序連接表

SELECT i.*, ii.image_src, ii.caption 
FROM itineraries AS i 
LEFT OUTER JOIN itineraries_images AS ii ON i.id=ii.itineraries_id AND ii.is_live=1 
WHERE i.is_live=1 
GROUP BY ii.itineraries_id 
ORDER BY i.id, ii.sort 

一直在尋找在子查詢...但仍無法得到它的工作:(

千恩萬謝,

搶劫。

+0

你有這樣的'GROUP BY ii.itineraries_id'但不是在'select'你正在嘗試做什麼? – 2014-03-24 19:56:04

回答

1

這將做的工作,會給你最新的image_src爲您定義顯示的圖像表中的ID是AUTO_INCREMENT所以ORDER BY ii.id DESC在GROUP_CONCAT將組按降序排列,並通過使用SUBSTRING_INDEX會給你最新的圖像

SELECT i.*, 
SUBSTRING_INDEX(GROUP_CONCAT(ii.image_src ORDER BY ii.id DESC),',',1) image_src , 
SUBSTRING_INDEX(GROUP_CONCAT(ii.caption ORDER BY ii.id DESC),',',1) caption  
FROM itineraries AS i 
LEFT OUTER JOIN itineraries_images AS ii ON i.id=ii.itineraries_id AND ii.is_live=1 
WHERE i.is_live=1 
GROUP BY i.id 
ORDER BY i.id, ii.sort 
圖像
+1

永遠不會想到這一點! ..謝謝 :) –

0

大概你想要在每個行程中的第一個圖像。這是你如何做到這一點使用not exists

SELECT i.*, ii.image_src, ii.caption 
FROM itineraries i LEFT OUTER JOIN 
    itineraries_images ii 
    ON i.id=ii.itineraries_id AND ii.is_live=1 
WHERE i.is_live = 1 and 
     not exists (select 1 
        from itineraries_images ii2 
        where ii2.itineraries_id = ii.itinieraries_id and 
         ii2.is_live = 1 and 
         ii2.sort > ii.sort 
       ) 
ORDER BY i.id