Mysql通过连接从内部选择

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)

我可以这样做吗?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) 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