2013-09-24 46 views
0

所以這是我的查詢:MySQL的 - LEFT JOIN columnX的值,其中MAX(columnY)

SELECT SQL_CALC_FOUND_ROWS wagons.id, 
         wagons.mid, 
         wagons.year, 
         wagons.make, 
         wagons.model, 
         wagons.nickname, 
         wagons.description, 
         members.first, 
         members.last, 
         wagon_photos.filename, 
         Count(DISTINCT(likes.id)) AS likes, 
         Count(DISTINCT(comments.id)) AS comments 
FROM wagons 
    INNER JOIN members 
      ON members.mid = wagons.mid 
    LEFT JOIN wagon_photos 
      ON wagon_photos.wid = wagons.id 
    LEFT JOIN likes 
      ON likes.wid = wagons.id 
    LEFT JOIN comments 
      ON comments.wid = wagons.id 
GROUP BY wagons.id 
ORDER BY wagons.id DESC 
LIMIT 10 

我試圖獲取wagon_photos.filename其中wagon_photos.default爲最大值。 (這是一個布爾值,其中只有一行(對於每個wagon_photos.wid將爲1.)在未選中默認圖片的情況下,我希望它返回最低的wagon_photos.id(如果可能)。

我已經嘗試了許多使用ORDER BY和GROUP BY的查詢,但我認爲它可能比這更復雜一點。如果我使用WHERE子句,則會遺漏任何沒有鏈接到它的任何照片的貨車,我不想這樣做。


CREATE TABLE `wagons` (
    `id` int(11) unsigned NOT NULL AUTO_INCREMENT, 
    `mid` int(8) DEFAULT NULL, 
    `year` varchar(4) DEFAULT NULL, 
    `make` varchar(50) DEFAULT NULL, 
    `model` varchar(100) DEFAULT NULL, 
    `nickname` varchar(200) DEFAULT NULL, 
    `description` mediumtext, 
    `featured` int(1) DEFAULT '0', 
    `visibility` int(1) DEFAULT '1', 
    `commision` int(1) DEFAULT '1', 
    `feat1title` varchar(50) DEFAULT NULL, 
    `feat2title` varchar(50) DEFAULT NULL, 
    `feat3title` varchar(50) DEFAULT NULL, 
    `feat4title` varchar(50) DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=617 DEFAULT CHARSET=utf8; 

CREATE TABLE `wagon_photos` (
    `id` int(11) unsigned NOT NULL AUTO_INCREMENT, 
    `wid` int(11) DEFAULT NULL, 
    `filename` varchar(255) DEFAULT NULL, 
    `caption` varchar(255) DEFAULT '', 
    `default` int(1) DEFAULT '0', 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=41 DEFAULT CHARSET=utf8; 
+0

我正在重讀這個,現在我不確定我是否回答了您的問題。你可以發佈你的表的樣子嗎?而且我不確定'默認設置'是指什麼。 –

+0

好吧,不是一個「集合」,而是一個布爾集合爲TRUE。如果一個成員有6張照片,則其中一個爲1,5爲0.我想返回「默認」列設置爲1的行。如果由於某種原因沒有設置,請選擇最低的行ID。我將添加上面的表結構。 – Devin

回答

0

那麼我現在感覺有點傻了。

我終於想到在wagon_photos的LEFT JOIN之後加入AND wagon_photos.default = 1並且它可以工作。我只需要確保他們總是有一個默認設置,所以我運行了一個腳本,在他們照片的每次更新中都會檢查默認設置,如果沒有設置,請將最新上傳設置爲默認設置。

... LEFT JOIN wagon_photos ON wagon_photos.wid = wagons.id AND wagon_photos.default = 1 ... 
0

,讓我試着理解你的要求。我想你問的是「如何構建一個查詢,我想選擇所有具有特定列的最大值的項目」。如果是這樣的話,你想把它分解成更簡單的單位來解決它。首先,您需要最大值本身:

select max(wp.default) as max_val from wagon_photos wp 

這會讓您獲得最大值。

接下來,您可以創建一個查詢,選擇行,其中一個條件爲真,但留下的條件了一會兒:

select (your rows) from wagons w where (a condition will go here) 

和你的條件是,你要wagon_photos.default等於最大值。因此,您需要加入該表格:

select (your rows) from wagons w join wagon_photos wp 
on wp.wid = w.id where wp.default = (something) 

您的「某事」恰好是我們在開始時創建查詢的max_value。所以把這個放在一起,你會使用子查詢,這將是這樣的:

select (your rows) from wagons w join wagon_photos wp 
on wp.wid = w.id where wp.default = (
    select max(wpb.default) from wagon_photos wpb 
) 

我還沒有建立自己運行此表,所以我可能會在括號出了差錯,它不包括你所有的連接。但我認爲這應該指向正確的方向。