1

我一直在绞尽脑汁想弄清楚如何加入这两个查询..

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

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)。这个想法是根据它与哪个场地相关以及它的顺序来提取一个图像行。然而,只需要提取一张图像。所以限制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

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

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

4

2 回答 2

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聚合函数?

因此,使用这个技巧,您可以编写一个首先提取的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 与实际图像连接起来。我无法检查您的查询,但我们的想法是这样进行。

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

于 2012-11-06T21:48:40.117 回答
0

我不太确定您的数据,但与缩略图表的 JOIN 和对您的大型查询的 group by 可能会起作用。

GROUP BY venues.id
于 2012-11-06T20:35:44.483 回答