Mysql选择内部选择与连接

时间:2014-04-06 20:22:08

标签: mysql sql datetime select

我可以这样做吗?我用户内部选择以选择大于NOW()的最低日期,例如9.4.2014将为每个事件ID选择此数据。现在我想回复一下,这是代码:

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

这是SQLfiddle http://www.sqlfiddle.com/#!2/6545ab/51,包含3个表:)

如何在顶部选择中访问这些内部细节?

1 个答案:

答案 0 :(得分:0)

如果有多个具有相同名称的列

,则需要将表别名赋予列
   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

以下是您使用HAVING子句检查距离应该小于5的查询的简化版本但是对于第二个事件,我的查询中的距离是112.773868864733我已经评论了having子句只是为了显示结果,第二件事是您要求的最近日期为NOW()但不包括过去的日期,因此在您提供的event_showtime

示例数据集中
`id_show`, `id_event`, `latitude`, `longitude`, `event_date_time`
(1, 1, 49.2016762922894, 18.7615620750428, '2014-03-31 16:13:17'),
(2, 1, 49.2016762922894, 18.7615620750428, '2014-04-01 20:00:00'),
(3, 2, 49.2113914818564, 18.7520992416382, '2014-03-31 15:00:00'),
(4, 2, 49.0545135142313, 20.2952223676682, '2014-04-16 11:00:00'),
(5, 2, 49.2113914818564, 18.7520992416382, '2014-04-23 11:00:00'),
(6, 2, 49.0545135142313, 20.2952223676682, '2014-04-30 11:00:00'),
(7, 2, 49.2016762922894, 18.7615620750428, '2014-04-29 12:00:00'),
(8, 1, 49.2016762922894, 18.7615620750428, '2014-04-24 12:00:00');

对于事件ID 1,有3个日期时间2014-03-31 16:13:17 ,2014-04-01 20:00:00,2014-04-24 12:00:00日期2014-04-24 12:00:00是最接近事件ID 2的日期2014-04-16 11:00:00是最近的一个而不是第23个,第三个问题在id_show错误的评论中,您从子查询中的最后一次加入需要另一个条件event_date_time加入以获得您需要的确切ID

希望它有意义

Fiddle Demo

根据您的具体要求,您可以选择距离受限的最近日期

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 

Fiddle Demo