我一直绞尽脑汁想要研究如何加入这两个问题。
我的目标是根据某些标准返回多个场地行(来自场地)......这是我当前的查询所做的....
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
进入我的第一个查询,并将此新字段标记为“缩略图”。
真的很感激任何帮助。谢谢!
答案 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