簡體   English   中英

MySQL-columnX的LEFT JOIN值,其中MAX(columnY)

[英]MySQL - LEFT JOIN value of columnX where 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;

讓我嘗試了解您的要求。 我認為您要問的是“如何構造查詢以選擇所有具有特定列的最大值的項目”。 如果是這樣,您想將其分解為更簡單的單元以解決它。 首先,您將需要最大值本身:

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
)

我自己沒有設置表來運行該表,因此我可能對括號感到厭煩,並且其中不包括所有聯接。 但是我認為這應該為您指明正確的方向。

好吧,我現在覺得有點傻。

我終於想到在AND wagon_photos.default = 1的LEFT JOIN之后添加AND wagon_photos.default = 1 ,並且可以正常工作。 我只需要確保他們始終使用默認設置即可,所以我運行了一個腳本,該腳本在每次更新照片時都會檢查默認設置,如果未設置默認默認設置,則將最新上傳設置為默認設置。

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

暫無
暫無

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

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