复杂的MySQL加入

时间:2011-10-27 02:27:38

标签: php mysql join

我有以下MySQL查询:

SELECT Project.*, `trk_deleted`, `trk_status`, `trk_state` 
   FROM `project` AS `Project` LEFT JOIN `trackline` ON `prj_id` = `trk_project` 
   WHERE `prj_deleted` = '0' GROUP BY `prj_id` ORDER BY `prj_name`;

这有点难以解释,但基本上,我的数据库中有一个结构,其中 Projects 有多个 Tracklines 。这两个实体分别具有字段prj_deletedtrk_deleted,如果它被删除(从视图中隐藏),则可以具有1值,或者0值不被删除(仍然在视图中)。 / p>

我的项目视图页面根据该项目中的轨迹线显示每个项目的图标。这些图标根据trk_statustrk_state

的值显示

我的项目视图页面应该只显示项目一次,即使它有多个跟踪线(因此GROUP BY prj_id

我的问题:

来自GROUP BY上的Mysql文档:

  

“此外,添加ORDER BY子句不会影响每个组中值的选择。在选择值之后会对结果集进行排序,而ORDER BY不会影响服务器选择的值。” p>

理想情况下,我的项目视图页面应显示未删除的跟踪线的图标。这就是为什么我希望在发生GROUP BY之前可以对trk_deleted进行ORDER BY,以便使用未删除的轨迹线进行分组。

希望有人能够理解我想在这里得到什么。

2 个答案:

答案 0 :(得分:0)

如果您可以提供一些示例数据以及您希望响应的内容,我可能会帮助您提供更好的查询。同时:

SELECT Project.*, MAX(`trk_deleted`), MAX(`trk_status`), MAX(`trk_state`)
FROM `project` AS `Project` 
LEFT JOIN `trackline` ON `prj_id` = `trk_project` AND trk_deleted = '0'
WHERE `prj_deleted` = '0'
GROUP BY `prj_id` ORDER BY `prj_name`;

答案 1 :(得分:0)

如果我找到了你,你想要获得所有未删除的项目,是否有轨迹线,以及未删除的轨迹线。但添加trk_delete = 0会排除没有跟踪线的项目。

我对mysql不太熟悉,但我认为你想要的是IS NULL

SELECT 
    Project.*, 
    `trk_deleted`, 
    `trk_status`, 
    `trk_state` 
FROM 
    `project` AS `Project` 
LEFT JOIN 
    `trackline` ON `prj_id` = `trk_project` 
WHERE 
    `prj_deleted` = '0' 
    AND trk_deleted = '0' OR trk_deleted IS NULL
GROUP BY 
    `prj_id` 
ORDER BY 
    `prj_name`

如果不是这样,请自己澄清

相关问题