简体   繁体   English

获取每个ID的第一行

[英]Get the first line for each ID

Today, I would like to get the list of all events of a list which have been selected or have the farest date. 今天,我想获取列表中所有已选择或日期最远的事件的列表。 I actually use the following code 我实际上使用以下代码

SELECT choices.id AS id, events.id AS event_id,
events.owner_id, choices.selected, 
choices_dates.label AS events_date
FROM events
LEFT JOIN polls ON (events.id = polls.event_id)
LEFT JOIN choices ON (polls.id = choices.poll_id)
LEFT JOIN choices_dates ON (choices.id = choices_dates.choice_id)
WHERE polls.kind = 'date'
ORDER BY events.id, choices.selected DESC, events_date DESC;

I obtain this result : 我得到这个结果:

id         event_id         owner_id         selected         events_date
2          1         1         0         2011-04-20 12:00:00
1          1         1         0         2011-04-20 00:00:00
7          2         1         0         2011-04-20 12:00:00
6          2         1         0         2011-04-20 00:00:00
13         3         1         0         2011-04-22 15:57:54
12         3         1         0         2011-04-20 12:00:00
11         3         1         0         2011-04-20 00:00:00

But here is what I want : 但是,这就是我想要的:

id         event_id         owner_id         selected         events_date
2          1         1         0         2011-04-20 12:00:00
7          2         1         0         2011-04-20 12:00:00
13         3         1         0         2011-04-22 15:57:54

I can't do nested query because I am creating a VIEW and the group by gives me random results (I obtain the first line for the event_id 1, and the last one for the event_id 2, ...) 我无法执行嵌套查询,因为我正在创建VIEW,并且group by给了我随机的结果(我获得了event_id 1的第一行,而event_id 2的最后一行,...)

For now, I could do the job with php function, but it is not optimisez and my code is dirty. 就目前而言,我可以使用php函数来完成这项工作,但是它不是optimisez,而且我的代码很脏。

Does someone have any idea for doing this with a great SQL function ? 有人对使用出色的SQL函数执行此操作有任何想法吗?

Thanks, Kevin 谢谢,凯文

EDIT : I've successeed to do what i want : I've used two different VIEW : 编辑:我已经成功地做了我想做的事情:我使用了两种不同的视图:

CREATE VIEWview_events_maxAS SELECT events.id AS event_id, MAX(choices.selected) AS max_selected, MAX(choices_dates.label) AS max_events_date FROM events LEFT JOIN polls ON (events.id = polls.event_id) LEFT JOIN choices ON (polls.id = choices.poll_id) LEFT JOIN choices_dates ON (choices.id = choices_dates.choice_id) WHERE polls.kind = 'date' GROUP BY event_id CREATE VIEWview_events_maxAS SELECT events.id AS event_id,MAX(choices.selected)AS max_selected,MAX(choices_dates.label)AS max_events_date FROM events LEFT JOIN轮询打开(events.id = polls.event_id)LEFT JOIN选择打开(polls.id = choices.poll_id)左联接choices_dates ON(choices.id = choices_dates.choice_id)WHERE polls.kind ='date'GROUP BY event_id

AND

CREATE VIEW view_events_correct AS ( SELECT choices.id AS id, events.id AS event_id, events.owner_id, choices.selected, choices_dates.label AS event_date FROM events LEFT JOIN polls ON (events.id = polls.event_id) LEFT JOIN choices ON (polls.id = choices.poll_id) LEFT JOIN choices_dates ON (choices.id = choices_dates.choice_id INNER JOIN view_events_max ON (events.id = view_events_max.event_id AND (choices.selected = 1 OR (choices.selected = view_events_max.max_selected AND choices_dates.label = view_events_max.max_events_date))) ) 创建视图view_events_correct AS(SELECT choices.id AS id,events.id AS event_id,events.owner_id,choices.selected,choices_dates.label AS event_date FROM events LEFT JOIN轮询打开(events.id = polls.event_id)LEFT JOIN选择打开(polls.id = choices.poll_id)左联接choices_dates开(choices.id = choices_dates.choice_id INNER JOIN view_events_max ON(events.id = view_events_max.event_id AND(choices.selected = 1 OR(choices.selected = view_events_max.max。 choices_dates.label = view_events_max.max_events_date))))

Thanks everybody for your help, Kevin 谢谢大家的帮助,凯文

I know in Oracle you could use analytic functions to do this. 我知道在Oracle中,您可以使用分析功能来做到这一点。 I dont know if there is something similar for mySql... 我不知道mySql是否有类似的东西...

select id, event_id, owner_id, selected, events_date from (
SELECT choices.id AS id, events.id AS event_id, events.owner_id as owner_id,
choices.selected as selected,
choices_dates.label AS events_date,
max(choices_date.label) over (partition by events.id) as max_events_date
FROM events LEFT JOIN polls ON (events.id = polls.event_id) LEFT JOIN choices ON
(polls.id = choices.poll_id) LEFT JOIN choices_dates ON (choices.id =
choices_dates.choice_id)
WHERE polls.kind = 'date') innerview
where events_date = max_events_date
order by event_id, selected DESC, events_date DESC;

Does something like this (untested, lacking both a description of the schema, and the version of your database software) work? 这样的事情(未经测试,缺少模式描述和数据库软件版本)是否可行?

select choices.id as id
     , events.id as event_id
     , events.owner_id
     , choices.selected
     , choices_dates.label as events_date
from
(
    SELECT events.id as max_event_id
         , max(choices_dates.label) as max_events_date
    FROM events
    LEFT JOIN polls ON (events.id = polls.event_id)
    LEFT JOIN choices ON (polls.id = choices.poll_id)
    LEFT JOIN choices_dates ON (choices.id = choices_dates.choice_id)
    WHERE polls.kind = 'date'
    GROUP BY events.id
) 
LEFT JOIN polls ON (events.id = polls.event_id)
LEFT JOIN choices ON (polls.id = choices.poll_id)
LEFT JOIN choices_dates ON (choices.id = choices_dates.choice_id)
where events_date = max_events_date
  and events.id = max_event_id

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM