繁体   English   中英

对于一个表的每个值,从另一个表中获取并显示相应值的计数

[英]for each value of one table get and display count number of coresponding values from another table

不幸的是,我必须在 mysql/php 中执行此操作 我找了三天,大约有 10.000 个这样的解释,但没有(我重复没有)对我有用。 我都试过了。 我想问一下,抱歉。

我有两个表 - 文章和控件。

table "articles"
    ------------------
    art_id  | name |
    ------------------
       1    | aaa  |
       2    | bbb  |
       3    | ccc  |
       4    | ddd  |

table "control"
    --------------------------------------------
    con_id | art_id  |      data      |
    --------------------------------------------
       1   |     1   |   something-a  |
       2   |     2   |   something-b  |
       3   |     1   |   something-a  |
       4   |     2   |   something-c  | 
       5   |     3   |   something-f  |

art_id 存在于两个表中。 现在我想要什么 - 查询: "select * from articles order by art_id ASC"显示在表中,还有一个单元格显示表 CONTROL 中每个 art_id 的计数......所以我尝试了 join、left join、inner加入 - 我得到错误......我也尝试过每个只得到一个结果(例如,所有东西都得到 2 个)......这是半正确的,但它显示了正确结果的数组,它甚至没有加入!!!

$query = "SELECT art_id, count(*) as counting 
FROM control GROUP BY art_id ORDER BY con_id ASC"; 
$result = mysql_query($query); 
while($row=mysql_fetch_array($result)) {
echo $row['counting'];
}

这显示 221 -

-------------------------------------------------
art_id | name | count (this one from control) |
-------------------------------------------------
   1   |  aaa |   221   |
   2   |  bbb |   221   |
   3   |  ccc |   221   |

它应该是:

for art_id(value1)=2, 
for art_id(2)=2, 
for art_id(3)=1 

它应该很简单 - 就像在查询中显示的 CONTROL 表中的值计数关于“文章”表......

表格文章页面查询结果应该是: "select * from articles order by art_id ASC"

-------------------------------------------------
art_id | name | count (this one from control) |
-------------------------------------------------
   1   |  aaa |   2   |
   2   |  bbb |   2   |
   3   |  ccc |   1   |

所以也许我应该使用 JOIN 或 join plus 为每个...也尝试过,但是我不确定什么是正确的回声...总而言之,我完全迷失在这里。 请帮忙。 谢谢你。

所以想象一下这分两步:

  1. control表中获取每个art_id的计数
  2. 使用您的articles表,从步骤 1 中获取计数

这会给你一个看起来像这样的查询:

SELECT a.art_id, a.name, b.control_count
FROM articles a
INNER JOIN
(
    SELECT art_id, COUNT(*) AS control_count
    FROM control
    GROUP BY art_id
) b
ON a.art_id = b.art_id;

这会给你你正在寻找的结果。

但是,您可以一次性完成所有操作,而不是使用子查询:

SELECT a.art_id, a.name, COUNT(b.art_id) AS control_count
FROM articles a
INNER JOIN control b
  ON a.art_id = b.art_id
GROUP BY a.art_id, a.name;

SQL 小提琴演示

SELECT *, (SELECT COUNT(control.con_id) FROM control WHERE control.art_id = articles.art_id) AS count_from_con FROM articles ORDER BY art_id DESC;

如果我正确理解您的问题,则此查询应该可以解决问题。

编辑:创建了您所描述的表,并且可以正常工作。

SELECT * FROM articles;
+--------+------+
| art_id | name |
+--------+------+
|      1 | aaa  |
|      2 | bbb  |
|      3 | ccc  |
|      4 | ddd  |
+--------+------+
4 rows in set (0.00 sec)

SELECT * FROM control;
+--------+--------+------+
| con_id | art_id | data |
+--------+--------+------+
|      1 |      1 | NULL |
|      2 |      2 | NULL |
|      3 |      1 | NULL |
|      4 |      2 | NULL |
|      5 |      3 | NULL |
+--------+--------+------+
5 rows in set (0.00 sec)

SELECT *, (SELECT COUNT(control.con_id) FROM control WHERE control.art_id = articles.art_id) AS count_from_con FROM articles ORDER BY art_id ASC;
+--------+------+----------------+
| art_id | name | count_from_con |
+--------+------+----------------+
|      1 | aaa  |              2 |
|      2 | bbb  |              2 |
|      3 | ccc  |              1 |
|      4 | ddd  |              0 |
+--------+------+----------------+

你还没有完全解释你想用打印完成什么,但这里有一个 PHP 例子:(使用PDO而不是mysql_

$pdo = new PDO(); // Make your connection here
$stm = $pdo->query('SELECT *, (SELECT COUNT(control.con_id) FROM control WHERE control.art_id = articles.art_id) AS count_from_con FROM articles ORDER BY art_id ASC');
while( $row = $stm->fetch(PDO::FETCH_ASSOC) )
{
    echo "Article with id: ".$row['art_id']. " has " .$row['count_from_con'].' connected rows in control.';
}

或者使用 mysql_ 扩展名:

$result = mysql_query('SELECT *, (SELECT COUNT(control.con_id) FROM control WHERE control.art_id = articles.art_id) AS count_from_con FROM articles ORDER BY art_id ASC');
while( $row = mysql_fetch_assoc($result) )
{
    echo "Article with id: ".$row['art_id']. " has " .$row['count_from_con'].' connected rows in control.';
}

这应该是足够的示例来帮助您完成所需的工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM