php - JOIN Many table while GROUP BY and COUNT GROUP BY row in MySQL

标签 php mysql count

我的数据库中有这样的表

lp_kon

ID | lpkonName
1  | kon1
2  | kon2

lp_seb

ID | ID_lpkon | lpsebName
1  |    1     |  seb1
2  |    2     |  seb3

lp_rek

ID | ID_lpseb | lprekName
1  |   1      | rek1
2  |   1      | rek2

lp_tl

ID | ID_lprek | lptlName
1  |    1     | tl1
2  |    1     | tl2

我使用这个查询来连接这 4 个表

SELECT
    a.id as id_lpkon,
    b.id as id_seb,
    c.id as id_rek,
    d.id as id_tl
FROM `lp_kon` a 
left OUTER JOIN lp_seb b  ON a.id = b.ID_lpkon
LEFT OUTER join lp_rek c  on b.id = c.ID_lpseb
LEFT OUTER join lp_tl  d  on c.id = d.ID_lprek
ORDER by a.id ASC

我得到了这样的结果

id_lpkon|id_lpseb|id_lprek|id_lptl|
1       |  1     |  1     |  1    |
1       |  1     |  1     |  2    |
1       |  1     |  2     | NULL  |
1       |  2     | NULL   | NULL  |
2       |  Null  | NULL   | NUll  |

如何在分组时计算表格行数。喜欢下面的结果

id_lpkon | count(lpkon) | id_seb | count(lpseb | id_rek | count(lprek) | id_lptl | count(lptl)   
1        |     4        |    1   |    3        |   1    |   2          |1        | 1       | 
1        |     4        |    1   |    3        |   1    |   2          |2        | 1       | 
1        |     4        |    1   |    3        |   2    |   1          |NUll     |NUll     |
1        |     4        |    2   |    1        |  NULL  | NULL         |NULL     |NULL     |
2        |     1        |  NULL  |   NULL      |  NULL  | NULL         |NULL     |

所以对于每一行,每个关系表都有一个计数行

使用查询更新

Lp_kon

CREATE TABLE `lp_kon` ( `ID` int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT, `lpkonName` text NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1
INSERT INTO `lp_kon` (`ID`, `lpkonName`) VALUES (NULL, 'kon1'), (NULL, 'kon2');

Lp_seb

CREATE TABLE `lp_seb` ( `ID` int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,`ID_lpkon` text NOT NULL, `lpsebName` text NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1
INSERT INTO `lp_seb` (`ID`,`ID_lpkon`, `lpsebName`) VALUES (NULL,`1`,'seb1'), (NULL,`2`,'seb3');

Lp_rek

  CREATE TABLE `lp_rek` ( `ID` int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,`ID_lpseb` text NOT NULL, `lprekName` text NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1
INSERT INTO `lp_rek` (`ID`,`ID_lpkon`, `lprekName`) VALUES (NULL,`1`,'rek1'), (NULL,`1`,'rek2');

Lp_tl

  CREATE TABLE `lp_tl` ( `ID` int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,`ID_lprek` text NOT NULL, `lptlName` text NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1
INSERT INTO `lp_tl` (`ID`,`ID_lprek`, `lpsebName`) VALUES (NULL,`1`,'tl1'), (NULL,`1`,'tl2');

最佳答案

我认为这个问题用 PHP 更容易解决。

使用您的查询并将数据提取到关联数组中。我应该看起来像这样:

$dbData = [
    ['id_lpkon' => 1, 'id_lpseb' => 1,    'id_lprek' => 1,    'id_lptl'  => 1],
    ['id_lpkon' => 1, 'id_lpseb' => 1,    'id_lprek' => 1,    'id_lptl'  => 2],
    ['id_lpkon' => 1, 'id_lpseb' => 1,    'id_lprek' => 2,    'id_lptl'  => null],
    ['id_lpkon' => 1, 'id_lpseb' => 2,    'id_lprek' => null, 'id_lptl'  => null,],
    ['id_lpkon' => 2, 'id_lpseb' => null, 'id_lprek' => null, 'id_lptl'  => null,]
];

现在使用嵌套的 foreach 循环来计算所有获取的值:

$columns = ['id_lpkon', 'id_lpseb', 'id_lprek', 'id_lptl'];
$counts = [];
foreach ($columns as $column) {
    $counts[$column] = [];
}

foreach ($dbData as $row) {
    foreach ($row as $column => $value) {
        if ($value === null) {
            continue;
        } elseif (isset($counts[$column][$value])) {
            $counts[$column][$value]++;
        } else {
            $counts[$column][$value] = 1;
        }
    }
}

你可以在这里停下来,因为你已经在 $counts 数组中有了所需的数据,它看起来像这样:

$counts = [
  'id_lpkon' => [1 => 4, 2 => 1],
  'id_lpseb' => [1 => 3, 2 => 1],
  'id_lprek' => [1 => 2, 2 => 1],
  'id_lptl'  => [1 => 1, 2 => 1],
];

但是如果您需要一个“表”中的数据,请使用下一个嵌套的 foreach 循环:

foreach ($dbData as $rn => $row) {
    foreach ($row as $column => $value) {
        $countColumn = $column . '_count';
        if ($value === null) {
            $dbData[$rn][$countColumn] = null;
        } else {
            $dbData[$rn][$countColumn] = $counts[$column][$value];
        }
    }
}

演示:http://rextester.com/XQTSX69507

关于php - JOIN Many table while GROUP BY and COUNT GROUP BY row in MySQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45517501/

相关文章:

php - 基于动态表单生成器的mysql数据库动态建表

mysql - WordPress 太多重定向 IIS 服务器

java - 计算目录中的图像

mysql - 行数,其中column1 ='value1' 和column1 ='value2' 按column2 分组

sql - 如何在 SQL 中获取组中某个项目的整数?

javascript - 如何删除地址栏中页面的 URL?

php - 如何使用 nl2br() 来处理带有 '\r\n' 的字符串?

php - 当我单击导出时,phpmyadmin 中出现此错误

php - 如何在wordpress中调用存储过程?

php - MySQL 语法不返回结果