Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MySql-连接另一个具有多行的表,将一个查询插入另一个查询?_Php_Mysql_Sql - Fatal编程技术网

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条款的条件不同,这有什么特别的原因吗?我怀疑这可能