Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.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 SQL中m/n连接表上的计数值_Mysql_Sql - Fatal编程技术网

Mysql SQL中m/n连接表上的计数值

Mysql SQL中m/n连接表上的计数值,mysql,sql,Mysql,Sql,我有四个表,想知道某个名字有多少个位置和下载。 名称和位置通过名称_位置表连接 这是我的桌子: 表“名称” 表“位置” 表“名称\u位置” 表“下载” 结果应该是: ID | name | locations | downloads ================================= 1 | foo | 1 | 3 2 | bar | 3 | 0 3 | zoo | 1 | 1 4 | luu | 0

我有四个表,想知道某个名字有多少个位置和下载。
名称
位置
通过
名称_位置
表连接

这是我的桌子:

表“
名称

表“
位置

表“
名称\u位置

表“
下载

结果应该是:

ID | name | locations | downloads
=================================
 1 | foo  | 1         | 3
 2 | bar  | 3         | 0
 3 | zoo  | 1         | 1
 4 | luu  | 0         | 1
以下是我的尝试(没有下载栏):


我想这会管用的

SELECT n.id,
       n.name,
       COUNT(DISTINCT l.id) AS locations,
       COUNT(DISTINCT d.id) AS downloads
FROM names n LEFT JOIN names_location nl
  ON n.id = nl.name_id
LEFT JOIN downloads dl
  ON n.id = dl.name_id
LEFT JOIN locations l
  ON l.id = nl.location_id
GROUP BY n.id, n.name

我想这会管用的

SELECT n.id,
       n.name,
       COUNT(DISTINCT l.id) AS locations,
       COUNT(DISTINCT d.id) AS downloads
FROM names n LEFT JOIN names_location nl
  ON n.id = nl.name_id
LEFT JOIN downloads dl
  ON n.id = dl.name_id
LEFT JOIN locations l
  ON l.id = nl.location_id
GROUP BY n.id, n.name

所有这些似乎都有效。这是另一个

SELECT 
  a.ID,
  a.name,
  COUNT(c.location) AS locations,
  COUNT(d.timestamp) AS downloads 
FROM names AS a
  LEFT JOIN names_locations AS b on a.ID=b.name_id
  LEFT JOIN locations AS c ON b.location_id=c.ID
  LEFT JOIN downloads AS d ON a.ID=d.name_id
GROUP BY a.name

所有这些似乎都有效。这是另一个

SELECT 
  a.ID,
  a.name,
  COUNT(c.location) AS locations,
  COUNT(d.timestamp) AS downloads 
FROM names AS a
  LEFT JOIN names_locations AS b on a.ID=b.name_id
  LEFT JOIN locations AS c ON b.location_id=c.ID
  LEFT JOIN downloads AS d ON a.ID=d.name_id
GROUP BY a.name
输出:

+------+------+-----------+-----------+
| id   | name | locations | downloads |
+------+------+-----------+-----------+
|    1 | foo  |         1 |         3 |
|    2 | bar  |         3 |         0 |
|    3 | zoo  |         1 |         1 |
|    4 | luu  |         0 |         1 |
+------+------+-----------+-----------+
4 rows in set (0.00 sec)
输出:

+------+------+-----------+-----------+
| id   | name | locations | downloads |
+------+------+-----------+-----------+
|    1 | foo  |         1 |         3 |
|    2 | bar  |         3 |         0 |
|    3 | zoo  |         1 |         1 |
|    4 | luu  |         0 |         1 |
+------+------+-----------+-----------+
4 rows in set (0.00 sec)


请更新您的问题,尝试解决此问题。@AgRizzo非常熟悉是的,这是我以前的问题。我无法理解id=1的位置计数是1,而id=2的位置计数是3。。如果我们正在考虑不同的位置,id=2的位置是否应该为2?@Nishant在名称位置表中有第三个
id=2
,请用您的尝试更新您的问题为了解决这个问题,@AgRizzo非常熟悉是的,这是我之前的问题。我无法理解id=1的位置数是1,而id=2的位置数是3。。如果我们考虑的是不同的位置,那么对于id=2,它不应该是2吗?@Nishant在names\u locations表中有第三个
id=2
。我已经忘记了不同的位置,你明白了。对于id=2I,位置计数为2。我假设他们想要匹配不同的位置,也许不应该,因为他们在期望的输出中显示了3。用COUNT(DISTINCT nl.id)替换COUNT(DISTINCT l.id)将更改计数以匹配其示例output.yep。我已经忘记了不同的位置,你明白了。对于id=2I,位置计数为2。我假设他们想要匹配不同的位置,也许不应该,因为他们在期望的输出中显示了3。将计数(不同的l.id)替换为计数(不同的nl.id)将更改计数以匹配其示例输出。+---+----+----+----+----+----+----+----ID | name | locations | downloads |+----+----+----+----2 | bar | 3 | 0 | 1 | foo | 3 | 4 | luu | 0 | 1 |+------+------+-----------+-----------+设置4行(0.00秒)。。我运行了它,得到了如上所述的输出,这是预期的输出吗..是的,正如我在@Alden的回答中所评论的,我忘记了获得正确结果所需的
DISTINCT()
部分。因此,我对他的回答投了赞成票。简单地用另一个人的答案更新我的答案是违背我的原则的。我不认为这是由于不同的原因。。因为id=2的位置计数为3。。它有一个重复的位置标识。哦,你说得对。。。六羟甲基三聚氰胺六甲醚。。那是。。想不到的也许他想要身份证的总数提出了一个解决方案,该解决方案给出了所需的o/p++-------++-------++-------++-------+--+--+--ID | name | locations | downloads |+-------+--+--+----+--2 | bar | 3 | 1 | foo | 3 | 4 | luu | 0 | 1 |+------+------+-----------+-----------+设置4行(0.00秒)。。我运行了它,得到了如上所述的输出,这是预期的输出吗..是的,正如我在@Alden的回答中所评论的,我忘记了获得正确结果所需的
DISTINCT()
部分。因此,我对他的回答投了赞成票。简单地用另一个人的答案更新我的答案是违背我的原则的。我不认为这是由于不同的原因。。因为id=2的位置计数为3。。它有一个重复的位置标识。哦,你说得对。。。六羟甲基三聚氰胺六甲醚。。那是。。想不到的也许他想要身份证的总数提出了一个解决方案,给出了所需的o/p
SELECT 
  a.ID,
  a.name,
  COUNT(c.location) AS locations,
  COUNT(d.timestamp) AS downloads 
FROM names AS a
  LEFT JOIN names_locations AS b on a.ID=b.name_id
  LEFT JOIN locations AS c ON b.location_id=c.ID
  LEFT JOIN downloads AS d ON a.ID=d.name_id
GROUP BY a.name
SELECT
  t.id,t.n AS name,
  count(location_id) AS locations,
  t.downloads
FROM names_location 
RIGHT JOIN 
 (SELECT 
    names.id AS id,
    names.name AS n, 
    count(timestamp) AS downloads 
  FROM names
    LEFT JOIN downloads ON names.id = downloads.name_id
    GROUP BY id) AS t 
ON t.id = names_location.name_id
GROUP BY t.id
+------+------+-----------+-----------+
| id   | name | locations | downloads |
+------+------+-----------+-----------+
|    1 | foo  |         1 |         3 |
|    2 | bar  |         3 |         0 |
|    3 | zoo  |         1 |         1 |
|    4 | luu  |         0 |         1 |
+------+------+-----------+-----------+
4 rows in set (0.00 sec)