从主表的每一行中选择连接表中的单行

时间:2012-02-04 20:13:52

标签: mysql

我已经尝试过以前的一些答案,但它们并没有多大意义。

我有两个表,一个代表现实世界人群的“团体”,以及一个代表团体会议的“事件”。

我有一个非常简单的查询,可以选择组,在网站列表中显示它们,以及在列出他们即将召开的会议的组个人资料页面上的单独查询,我不确定使用什么技术要将“下一次会议”添加到组列表中,理想情况下需要将其作为MySQL查询中的另一列返回。

之前我对连接很好,但是在第一个表中每行将连接结果的数量限制为一个,似乎并不简单。

有关哪种技术可以证明这一点的简单建议?

谢谢!

粗略的架构如下;

CREATE TABLE `groups` (
  `id` varchar(12) NOT NULL,
  `title` varchar(30) NOT NULL,
  PRIMARY KEY (`slug`)
)

CREATE TABLE `events` (
  `id` int(6) NOT NULL AUTO_INCREMENT,
  `group` varchar(20) NOT NULL,
  `title` varchar(50) NOT NULL,
  `start` datetime NOT NULL,
  `finish` datetime NOT NULL,
PRIMARY KEY (`id`)
)

2 个答案:

答案 0 :(得分:0)

好的,这是技术答案,而不是解决方案:-)

此代码从子表中为每个父行选择每两行,按sort列排序。

SELECT
    parent.id, parent.name,
    c1.id, c1.name
FROM parent
JOIN child c1 ON c1.parent_id = parent.id
LEFT JOIN child c2 ON c2.parent_id = c1.parent_id AND c2.sort < c1.sort
GROUP BY parent.id, parent.name, c1.id, c1.name
HAVING COUNT(c2.id) < 2
ORDER BY parent.name;

采取from here

答案 1 :(得分:0)

您提供的架构不一致且您未提供查询...

为了给出某种答案,我假设groups.id = events.group

要显示下一个事件,您可以执行与此类似的操作:

SELECT G.*, M.EVENT FROM GROUPS G LEFT JOIN 
(
SELECT X.GROUP, MIN ( X.ID ) EVENT 
FROM EVENTS X 
INNER JOIN (SELECT E.GROUP G, MIN ( E.START ) S FROM EVENTS E WHERE E.START > NOW() GROUP BY E.GROUP) Y 
ON X.GROUP = Y.G AND X.START = Y.S
GROUP BY X.GROUP
) M ON G.ID = M.GROUP