0

所以这是我的查询:

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;
4

2 回答 2

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
)

我自己没有设置表格来运行它,所以我可能在括号上搞砸了,它不包括你所有的连接。但我认为这应该为您指明正确的方向。

于 2013-09-25T00:19:45.890 回答
0

嗯,我现在觉得有点傻。

我终于想到 AND wagon_photos.default = 1在 wagon_photos 的 LEFT JOIN 之后添加它并且它有效。我只需要确保他们始终具有默认设置,因此我运行了一个脚本,在每次更新他们的照片时,它都会检查默认设置,如果未设置,则将最新上传设置为默认设置。

... LEFT JOIN wagon_photos ON wagon_photos.wid = wagons.id AND wagon_photos.default = 1 ...
于 2013-09-28T19:41:57.253 回答