Php MySql-连接另一个具有多行的表,将一个查询插入另一个查询?
我绞尽脑汁想了好几个小时,想知道如何把这两个问题结合起来 我的目标是根据某些标准返回多个场馆行(来自场馆)。。。这就是我当前的查询所做的Php MySql-连接另一个具有多行的表,将一个查询插入另一个查询?,php,mysql,sql,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,
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
进入我的第一个查询,并将这个新字段标记为“缩略图”
任何帮助都将不胜感激。谢谢 我对您的数据不太确定,但在您的大型查询中加入缩略图表和分组方式可能会奏效
GROUP BY venues.id
我对您的数据不太确定,但在您的大型查询中,使用缩略图表和group by进行连接可能会起作用
GROUP BY venues.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
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
但不幸的是,这个子查询无法看到venu id
,因为它是在外部查询之前首先计算的(我认为这是MySql的一个限制),所以我们不能使用它,我们必须找到另一个解决方案。由于您使用的是LIMIT 1,因此使用just JOINS重写所需的条件并不容易
如果MySql提供FIRST()聚合函数会更容易,但由于它没有,我们必须模拟它,例如,请参见以下问题:
因此,使用这个技巧,您可以编写一个查询,首先为每个图像id
提取图像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
...
我还添加了一个连接,将第一个图像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
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
但不幸的是,这个子查询无法看到venu id
,因为它是在外部查询之前首先计算的(我认为这是MySql的一个限制),所以我们不能使用它,我们必须找到另一个解决方案。由于您使用的是LIMIT 1,因此使用just JOINS重写所需的条件并不容易
如果MySql提供FIRST()聚合函数会更容易,但由于它没有,我们必须模拟它,例如,请参见以下问题:
因此,使用这个技巧,您可以编写一个查询,首先为每个图像id
提取图像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
...
我还添加了一个连接,将第一个图像id与实际图像连接起来。我无法检查您的查询,但想法是这样进行
由于查询现在变得越来越复杂,越来越难以维护,我认为最好创建一个视图,为每个场馆提取第一张图像,然后在查询中只加入视图。这只是一个想法。让我知道它是否有效,或者您是否需要任何帮助 每个图像都有唯一的id吗?类似于
场馆\图像.id
?是场馆\图像。图像\ id,场馆\图像。图像\场馆\ id是一个包含与之相关的场馆\ id(场馆)的字段。每个图像是否具有唯一的id?类似于场馆图片.id
?是场馆图片.image\u id,场馆图片.image\u场馆id是一个包含相关场馆id(场馆)的字段。非常感谢您的帮助和详细说明。我重写了查询的第一部分,正如您所说,它返回完全相同的结果。但是,当我尝试添加第二个查询时,它不会出错,但不会产生任何结果。你说“创建视图”是什么意思?这是什么?如何实现?仅供参考,这是我的整个查询。。。如果只运行第二个查询,它是否显示正确的结果?它返回,对于每个图像\u场馆\u id,它正确显示第一个图像id?如果它是正确的,可能某些连接有问题……视图是一个存储的查询,您给查询一个名称,您可以像引用表一样引用它(或多或少)。e、 g.CREATE VIEW first_image AS Select…etc.
然后您可以在其他查询中引用它,名称为first_image
如果您像我建议的那样使用内部连接,您应该删除WHERE子句(除非您需要过滤更多内容),我可以看到WHERE条款的条件与on条款的条件不同,这有什么特别的原因吗?我怀疑这可能是问题所在。非常感谢您的帮助和详细描述。我重写了查询的第一部分,正如您所说,它返回完全相同的结果。但是,当我尝试添加第二个查询时,它不会出错,但不会产生任何结果。你说“创建视图”是什么意思?这是什么?如何实现?仅供参考,这是我的整个查询。。。如果只运行第二个查询,它是否显示正确的结果?它返回,对于每个图像\u场馆\u id,它正确显示第一个图像id?如果它是正确的,可能某些连接有问题……视图是一个存储的查询,您给查询一个名称,您可以像引用表一样引用它(或多或少)。e、 g.CREATE VIEW first_image AS Select…etc.
然后您可以在其他查询中引用它,名称为first_image
如果您像我建议的那样使用内部连接,您应该删除WHERE子句(除非您需要过滤更多内容),我可以看到WHERE条款的条件与on条款的条件不同,这有什么特别的原因吗?我怀疑这可能