![](/img/trans.png)
[英]MySQL query - single row in one table with multiple rows in another table
[英]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_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与实际图像连接在一起。 我无法检查您的查询,但想法是像这样继续进行。
由于查询现在变得越来越复杂且难以维护,我认为最好创建一个视图来提取每个场所的第一张图像,然后将视图仅加入查询中。 这只是一个想法。 让我知道它是否有效,或者您需要任何帮助!
我不太确定您的数据,但是在大型查询上使用缩略图表和group by进行JOIN可能会起作用。
GROUP BY venues.id
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.