Mysql通过连接从内部选择
我可以这样做吗?Bassi I用户内部选择为每个事件ID选择比现在大的最低日期,例如2014年4月9日。现在我想返回这个,下面是代码:Mysql通过连接从内部选择,mysql,sql,datetime,select,Mysql,Sql,Datetime,Select,我可以这样做吗?Bassi I用户内部选择为每个事件ID选择比现在大的最低日期,例如2014年4月9日。现在我想返回这个,下面是代码: SELECT id_event , event_title, event_details, dates.event_date, id_show, id_category, distance FROM( SELECT event.id_event id_event, event_title, event_details, min(event_date_time)
SELECT id_event , event_title, event_details, dates.event_date, id_show, id_category, distance FROM(
SELECT event.id_event id_event, event_title, event_details, min(event_date_time) event_date_time, event_showtime.id_show , event_category.id_category id_category, ( 6371 * ACOS( COS( RADIANS( '49.20513921227407' ) ) * COS( RADIANS( event_showtime.latitude ) ) * COS( RADIANS( event_showtime.longitude ) - RADIANS( '18.762441839599678' ) ) + SIN( RADIANS( '49.20513921227407' ) ) * SIN( RADIANS( event_showtime.latitude ) ) ) ) AS distance
FROM event
JOIN event_showtime ON event.id_event = event_showtime.id_event
JOIN event_category ON event.id_category = event_category.id_category
JOIN ( SELECT id_event, min(event_date_time) as event_date_time FROM event_showtime
WHERE event_date_time > NOW()
GROUP BY id_event ) AS dates ON event.id_event = dates.id_event
WHERE event_date_time > NOW()
GROUP BY event.id_event
HAVING distance < '5'
ORDER BY distance
LIMIT 0 , 20
)t
以下是包含3个表的SQLfiddle:
如何访问顶部选择中的这些内部详细信息 如果有多个列具有相同的名称,则需要为列指定表别名
SELECT
es.id_show,
e.id_event ,
e.event_title,
e.event_details,
d.event_date_time,
ec.id_category,
( 6371 * ACOS( COS( RADIANS( '49.20513921227407' ) ) * COS( RADIANS( es.latitude ) ) * COS( RADIANS( es.longitude ) - RADIANS( '18.762441839599678' ) ) + SIN( RADIANS( '49.20513921227407' ) ) * SIN( RADIANS( es.latitude ) ) ) ) AS distance
FROM event e
JOIN event_showtime es ON e.id_event = es.id_event
JOIN event_category ec ON e.id_category = ec.id_category
JOIN ( SELECT id_event,
min(event_date_time) as event_date_time
FROM event_showtime
WHERE event_date_time > NOW()
GROUP BY id_event ) AS d
ON (es.id_event = d.id_event AND es.event_date_time =d.event_date_time)
WHERE d.event_date_time > NOW()
GROUP BY e.id_event
-- HAVING distance < '5'
ORDER BY distance
LIMIT 0 , 20
事件id 1有3个日期时间2014-03-31 16:13:172014-04-01 20:00:002014-04-24 12:00:00日期2014-04-24 12:00:00是事件id 2最接近的日期2014-04-16 11:00:00是最接近的日期而不是第23个日期,您在评论中询问的第三件事是,id_show对此是错误的。您从子查询的最后一次连接需要另一个条件,其中包含要连接的事件_date_time,以获得您所需的确切id
希望它有意义
对于您选择距离最近日期的具体要求,您可以这样做
SELECT t.* FROM (
SELECT
es.id_show,
e.id_event,
e.event_title,
e.event_details,
MIN(es.event_date_time) event_date_time,
ec.id_category,
es.distance
FROM
event e
JOIN event_category ec
ON e.id_category = ec.id_category
JOIN
(SELECT
`id_show`,
`id_event`,
`latitude`,
`longitude`,
event_date_time,
(
6371 * ACOS(
COS(RADIANS('49.20513921227407')) * COS(RADIANS(event_showtime.latitude)) * COS(
RADIANS(event_showtime.longitude) - RADIANS('18.762441839599678')
) + SIN(RADIANS('49.20513921227407')) * SIN(RADIANS(event_showtime.latitude))
)
) AS distance
FROM
event_showtime
WHERE `event_date_time` > NOW()
HAVING distance < 5) es
ON (e.id_event = es.id_event)
GROUP BY e.id_event
) t
JOIN `event_showtime` es USING(id_event,event_date_time)
ORDER BY t.distance
LIMIT 0, 20
很好,但是在我提供的小提琴上试了一下,你也发布了,id_show和datetime不匹配,请看一看insert语句:但它给了我一个新的外观:我已经修复了一点,但仍然缺少了一些东西:/with location as is bad该查询的ID event=2应该返回date=23.4和ID_show=5:P您能给我指一下方向吗?bug可能在哪里?@xooloo查看我的更新答案希望它能清除最近日期场景和id_show的所有问题非常感谢:P但请再次阅读我的最后一条消息您查询的第二行应该返回id_show=5,日期为23,因为距离为5公里。在查询中,我正在查找纬度为49.20513921227407、经度为18.762441839599678的位置,因此它无法返回120公里的距离值。它必须是id_show=5的行,因为它在距离中,并且最低日期为>现在。是的,你是对的2014-04-16 11:00:00因为第二个可以工作,但我需要这个包括距离条件,这非常重要。更多第二条评论,先生,你是上帝我认为这项工作,必须在真实数据库中进行一些测试:非常感谢
SELECT t.* FROM (
SELECT
es.id_show,
e.id_event,
e.event_title,
e.event_details,
MIN(es.event_date_time) event_date_time,
ec.id_category,
es.distance
FROM
event e
JOIN event_category ec
ON e.id_category = ec.id_category
JOIN
(SELECT
`id_show`,
`id_event`,
`latitude`,
`longitude`,
event_date_time,
(
6371 * ACOS(
COS(RADIANS('49.20513921227407')) * COS(RADIANS(event_showtime.latitude)) * COS(
RADIANS(event_showtime.longitude) - RADIANS('18.762441839599678')
) + SIN(RADIANS('49.20513921227407')) * SIN(RADIANS(event_showtime.latitude))
)
) AS distance
FROM
event_showtime
WHERE `event_date_time` > NOW()
HAVING distance < 5) es
ON (e.id_event = es.id_event)
GROUP BY e.id_event
) t
JOIN `event_showtime` es USING(id_event,event_date_time)
ORDER BY t.distance
LIMIT 0, 20