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

时间:2012-11-06 20:31:10

标签: php mysql sql

我一直绞尽脑汁想要研究如何加入这两个问题。

我的目标是根据某些标准返回多个场地行(来自场地)......这是我当前的查询所做的....

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

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

真的很感激任何帮助。谢谢!

2 个答案:

答案 0 :(得分: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()聚合函数会更容易,但由于它没有,我们必须模拟它,例如看到这个问题:How to fetch the first and last record of a grouped record in a MySQL query with aggregate functions?

因此,使用此技巧,您可以编写一个查询,为image_id首先提取every 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加入到实际图像中。我无法检查您的查询,但想法是这样的。

由于查询现在变得越来越复杂和难以保持,我认为最好创建一个视图,为每个场地提取第一个图像,然后只在查询中加入视图。这只是一个想法。如果它有用或者您需要任何帮助,请告诉我!

答案 1 :(得分:0)

我对你的数据不是很确定,但是在你的大型查询中使用缩略图表和一个分组的JOIN可能会有效。

GROUP BY venues.id