繁体   English   中英

MySql-连接具有多个行的另一个表,将查询插入另一个查询?

[英]MySql - Joining another table with multiple rows, inserting a query into a another query?

我花了好几个小时尝试解决如何加入这两个查询的过程。

我的目标是根据特定条件返回多个场地行(来自场地)……这就是我当前的查询。

SELECT venues.id AS ven_id, 
   venues.venue_name, 
   venues.sub_category_id, 
   venues.score, 
   venues.lat, 
   venues.lng, 
   venues.short_description, 
   sub_categories.id, 
   sub_categories.sub_cat_name, 
   sub_categories.category_id, 
   categories.id, 
   categories.category_name, 
   ((ACOS(  SIN(51.44*PI()/180)*SIN(lat*PI()/180) + COS(51.44*PI()/180)*COS(lat*PI()/180)*COS((-2.60796 - lng)*PI()/180)) * 180/PI())*60 * 1.1515) AS dist

FROM venues, 
  sub_categories, 
  categories 
WHERE 
  venues.sub_category_id = sub_categories.id 
  AND sub_categories.category_id = categories.id 
HAVING 
  dist < 5 
ORDER BY score DESC 
LIMIT 0, 100

但是,我需要在此查询中包括另一个字段(缩略图),该字段来自另一个表(venue_images)。 想法是根据与之相关的地点及其顺序提取一个图像行。 但是只需要提取一张图像。 所以LIMIT 1。

我基本上需要插入此查询:

SELECT 
  venue_images.thumb_image_filename, 
  venue_images.image_venue_id,  
  venue_images.image_order 
FROM venue_images 
WHERE venue_images.image_venue_id = ven_id //id from above query
ORDER BY venue_images.image_order 
LIMIT 1

进入我的第一个查询,并将这个新字段标记为“缩略图”。

任何帮助将不胜感激。 谢谢!

首先,您可以使用INNER JOIN编写第一个查询:

SELECT
  ...
FROM
  venues INNER JOIN sub_categories ON venues.sub_category_id = sub_categories.id 
  INNER JOIN categories ON sub_categories.category_id = categories.id
HAVING
  ...

结果应该是相同的,但我又喜欢这一点。

接下来,我想加入一个子查询,如下所示:

...
INNER JOIN (SELECT ... FROM venue_images 
              WHERE venue_images.image_venue_id = ven_id //id from above query
              ORDER BY venue_images.image_order 
              LIMIT 1) first_image

但不幸的是,此子查询看不到ven_id因为它首先在外部查询之前进行了评估(我认为这是MySql的局限性),因此我们不能使用它,而必须找到其他解决方案。 而且由于您使用的是LIMIT 1,仅使用JOINS重写所需的条件并不容易。

如果MySql提供FIRST()聚合函数会更容易,但是由于它没有,我们必须对其进行模拟,例如,请参见以下问题: 如何使用以下方法在MySQL查询中获取分组记录的第一条记录和最后一条记录集合函数?

因此,使用这一招,你可以写提取第一查询image_idevery image_venue_id

SELECT
  image_venue_id,
  SUBSTRING_INDEX(
    GROUP_CONCAT(image_id order by venue_images.image_order),',',1) as first_image_id
FROM venue_images
GROUP BY image_venue_id

并且此查询可以集成到上面的查询中:

SELECT
  ...
FROM
  venues INNER JOIN sub_categories ON venues.sub_category_id = sub_categories.id 
  INNER JOIN categories ON sub_categories.category_id = categories.id
  INNER JOIN (the query above) first_image on first_image.image_venue_id = venues.id
  INNER JOIN venue_images on first_image.first_image_id = venue_images.image_id
HAVING
  ...

我还添加了一个JOIN,将第一个图像ID与实际图像连接在一起。 我无法检查您的查询,但想法是像这样继续进行。

由于查询现在变得越来越复杂且难以维护,我认为最好创建一个视图来提取每个场所的第一张图像,然后将视图仅加入查询中。 这只是一个想法。 让我知道它是否有效,或者您需要任何帮助!

我不太确定您的数据,但是在大型查询上使用缩略图表和group by进行JOIN可能会起作用。

GROUP BY venues.id

暂无
暂无

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

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