Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.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
MySQL连接多个表?_Mysql_Left Join - Fatal编程技术网

MySQL连接多个表?

MySQL连接多个表?,mysql,left-join,Mysql,Left Join,我有三张桌子 TBL标记器 tblReviews tblImages 我想返回tblMarkers的所有记录,以及每个标记的所有评论和图像的计数。 为了使它更复杂,它应该返回已知点半径内的所有标记 因此,预期的结果将是 MarkerID MarkerName ReviewCount ImageCount 1223-SomeName-0-1 这是我到目前为止得到的,它返回了一个评论计数,但是我无法获得正确的SQL来添加图像计数 SELECT `tblMarkers`.`ID`, `tblMarke

我有三张桌子

TBL标记器 tblReviews tblImages

我想返回tblMarkers的所有记录,以及每个标记的所有评论和图像的计数。 为了使它更复杂,它应该返回已知点半径内的所有标记

因此,预期的结果将是

MarkerID MarkerName ReviewCount ImageCount

1223-SomeName-0-1

这是我到目前为止得到的,它返回了一个评论计数,但是我无法获得正确的SQL来添加图像计数

SELECT
`tblMarkers`.`ID`,
`tblMarkers`.`Type`,
`tblMarkers`.`Name`,
`tblMarkers`.`Latitude`,
`tblMarkers`.`Longitude`, 
(3959 * acos( cos( radians('45.1') ) * cos( radians( Latitude ) ) * cos( radians( Longitude ) - radians('6') ) + sin( radians('45.1') ) * sin( radians( Latitude ) ) ) )  
AS distance,
Count(`tblReviews`.`marker_id`) As reviewCount
FROM
`tblMarkers`
LEFT JOIN `tblReviews` ON `tblMarkers`.`ID` = `tblReviews`.`marker_id`
GROUP BY
`tblMarkers`.`ID`,
`tblMarkers`.`Type`,
`tblMarkers`.`Name`,
`tblMarkers`.`Latitude`,
`tblMarkers`.`Longitude`
HAVING
`distance` < '50'
ORDER BY
distance;

如何添加所有图像的计数?

如果图像表的ID字段是标记表ID字段的引用,则查询将为:

SELECT
`tblMarkers`.`ID`,
`tblMarkers`.`Type`,
`tblMarkers`.`Name`,
`tblMarkers`.`Latitude`,
`tblMarkers`.`Longitude`, 
(3959 * acos( cos( radians('45.1') ) * cos( radians( Latitude ) ) * cos( radians( Longitude ) - radians('6') ) + sin( radians('45.1') ) * sin( radians( Latitude ) ) ) )  
AS distance,
Count(`tblReviews`.`marker_id`) As reviewCount,
Count(`tblImage`.`ID`) As imageCount,
FROM
`tblMarkers`
LEFT JOIN `tblReviews` ON `tblMarkers`.`ID` = `tblReviews`.`marker_id`
LEFT JOIN `tblImage` ON `tblMarkers`.`ID` = `tblImages`.`ID`
GROUP BY
`tblMarkers`.`ID`,
`tblMarkers`.`Type`,
`tblMarkers`.`Name`,
`tblMarkers`.`Latitude`,
`tblMarkers`.`Longitude`
HAVING
`distance` < '50'
ORDER BY
distance;
选择
`tblMarkers`.`ID`,
`tblMarkers`.`Type`,
`tblMarkers`.`Name`,
`tblMarkers`.`纬度`,
`tblMarkers`.`经度`,
(3959*acos(弧度('45.1'))*cos(弧度(纬度))*cos(弧度(经度)-弧度('6'))+sin(弧度('45.1'))*sin(弧度(纬度)))
至于距离,
将(`tblReviews`.`marker_id`)计数为reviewCount,
计数(`tblImage`.`ID`)作为imageCount,
从…起
`TBL标记器`
在“tblMarkers”上左键连接“tblReviews”。`ID`=`tblReviews`.`marker\U ID`
在'tblMarkers'上左键连接'tblImage'。'ID`='tblImages`.'ID`
分组
`tblMarkers`.`ID`,
`tblMarkers`.`Type`,
`tblMarkers`.`Name`,
`tblMarkers`.`纬度`,
`tblMarkers`.`经度`
有
`距离`<'50'
订购人
距离;
试试这个:

SELECT M.ID
    , M.Type
    , M.Name
    , M.Latitude
    , M.Longitude
    , (3959 * acos(cos(radians('45.1')) * cos(radians(M.Latitude )) * cos(radians(M.Longitude) - radians('6')) + sin(radians('45.1')) * sin(radians(M.Latitude ))))  AS distance
    , IFNULL(COUNT(DISTINCT R.review_id) , 0) AS ReviewCount
    , IFNULL(COUNT(DISTINCT I.ID), 0) AS ImageCount
    FROM tblMarkers AS M
    LEFT JOIN tblReviews AS R ON R.marker_id = M.ID
    LEFT JOIN tblImages AS I ON I.marker_id = M.ID
    GROUP BY M.ID, M.Type, M.Name, M.Latitude, M.Longitude
    HAVING distance < 50
    ORDER BY distance
选择M.ID
,M.型
,M.姓名
,M.纬度
,M.经度
,(3959*acos(弧度('45.1'))*cos(弧度(米纬度))*cos(弧度(米经度)-弧度('6'))+sin(弧度('45.1'))*sin(弧度(米纬度)))作为距离
,IFNULL(计数(不同的R.review\u id),0)作为ReviewCount
,IFNULL(COUNT(DISTINCT I.ID),0)作为ImageCount
来自TBL Markers作为M
左连接tblReviews为R上的R.marker_id=M.id
左连接tblImages作为I.marker_id=M.id上的I
按M.ID、M.Type、M.Name、M.纬度、M.经度分组
距离小于50的
按距离排序
我打赌你已经知道左键了。所以我使用了
COUNT(DISTINCT R.review\u id))
来计算所有DISTINCTreview id(只要确保
review\u id
是唯一的)。如果特定标记记录没有相应的审阅和图像记录,我使用
IFNULL(XXX,0)
来显示
0


我过去常把你的问题说得干净利落。请随意询问。

正如您提到的图像表结构,与标记表的关系字段在哪里??没有它,你就无法获得计数。这是我尝试过的,但它无法运行。“参考标记”是什么意思?(告诉过你我是新手!就像你在评论表中有参考id一样。你应该在图像表中有相同的id tblImages中的id是标记的id(它们是相同的名称[id]有关系吗?),而在tblReviews中,tblmarker ID根据您的评论“链接”到tblReviews中的marker_ID,上述查询将起作用。请检查并让我知道。已编译(使用MYSQL front),但当我尝试运行时,出现错误“字段列表中的未知列'R.ID'”[/link]我明白了,这是因为
tblReview
表中没有
ID
列。编辑了我的答案。现在排序谢谢-我不得不从图像列表中删除DISTINCT语句以获得每个标记的图像数量,但除此之外它工作得很好!
SELECT M.ID
    , M.Type
    , M.Name
    , M.Latitude
    , M.Longitude
    , (3959 * acos(cos(radians('45.1')) * cos(radians(M.Latitude )) * cos(radians(M.Longitude) - radians('6')) + sin(radians('45.1')) * sin(radians(M.Latitude ))))  AS distance
    , IFNULL(COUNT(DISTINCT R.review_id) , 0) AS ReviewCount
    , IFNULL(COUNT(DISTINCT I.ID), 0) AS ImageCount
    FROM tblMarkers AS M
    LEFT JOIN tblReviews AS R ON R.marker_id = M.ID
    LEFT JOIN tblImages AS I ON I.marker_id = M.ID
    GROUP BY M.ID, M.Type, M.Name, M.Latitude, M.Longitude
    HAVING distance < 50
    ORDER BY distance