【问题标题】:How to calculate number of foreign keys in second table with a condition and display it with rows from first table - PHP - MySQL?如何使用条件计算第二个表中的外键数并使用第一个表中的行显示它 - PHP - MySQL?
【发布时间】:2015-06-10 17:08:07
【问题描述】:

我有两张表 tableatableb 如下所示;

表格

+--------+-------+-------+-------+------+
|   fa   |   fb  |  fc   |  fd   |  fe  |
+--------+-------+-------+-------+------+
|  col1  |  f11  |  f12  |  f13  |  x1  |
+--------+-------+-------+-------+------+
|  col2  |  f21  |  f22  |  f23  |  x2  |
+--------+-------+-------+-------+------+
|  col3  |  f31  |  f32  |  f33  |  x3  |
+--------+-------+-------+-------+------+
|  col4  |  f41  |  f42  |  f43  |  x4  |
+--------+-------+-------+-------+------+

表格b

+--------+-------+-------+------+------+
|  tbba  |  tbbb |  tbbc | tbbd | tbbe |
+--------+-------+-------+------+------+
|  cola  |  fa1  |  fa2  |  0   |  x1  |
+--------+-------+-------+------+------+
|  colb  |  fb1  |  fb2  |  0   |  x1  |
+--------+-------+-------+------+------+
|  colc  |  fc1  |  fc2  |  1   |  x1  |
+--------+-------+-------+------+------+
|  cold  |  fd1  |  fd2  |  1   |  x2  |
+--------+-------+-------+------+------+
|  cole  |  fe1  |  fe2  |  1   |  x2  |
+--------+-------+-------+------+------+
|  colf  |  ff1  |  ff2  |  0   |  x3  |
+--------+-------+-------+------+------+
|  colg  |  fg1  |  fg2  |  1   |  x3  |
+--------+-------+-------+------+------+
|  colh  |  fh1  |  fh2  |  1   |  x3  |
+--------+-------+-------+------+------+
|  coli  |  fi1  |  fi2  |  0   |  x3  |
+--------+-------+-------+------+------+
|  colj  |  fj1  |  fj2  |  0   |  x4  |
+--------+-------+-------+------+------+

我想生成一个类似的表格;

+--------+-------+-----+
|  col1  |  f11  |  1  |
+--------+-------+-----+
|  col2  |  f21  |  2  |
+--------+-------+-----+
|  col3  |  f31  |  2  |
+--------+-------+-----+
|  col4  |  f41  |  0  |
+--------+-------+-----+

这是 tableb tableb.tbbe 中 tablea tablea.fe 中的外键数,tableb.tbbd 字段的值 1。我有一个类似的查询;

SELECT a.fa , a.fb , COUNT( b.tbbe) 
FROM  tablea a
LEFT JOIN tableb b ON a.fe = b.tbbe
GROUP BY a.fa

但这会计算所有外键而不检查tableb.tbbd 字段的状态。如何创建此表?

你可以在这里参考我的另一个问题Efficient way to calculate number of foreign keys in second table and display it with rows from first table - PHP - MySQL

谢谢。

【问题讨论】:

  • 这对我来说不是很清楚,我看不出你从哪里得到你的计数。 (col1, f11) 你是怎么得到 1 的?
  • col1f11 是来自 tablea 的字段 fafb 的值。 1表示,外键x1tableb中出现了3次,但是当我们考虑tableb.tbbd字段时,它变成1,因为在三行中有两行,tbbd字段为0。
  • 好的,感谢您解决这个问题。我已经给出了答案和 SQL Fiddle 示例。

标签: php mysql


【解决方案1】:

您的查询中的错误只是您从未添加条件来也加入b.tbbd = 1。你可以这样添加:

SELECT a.fa, a.fb, COUNT(b.tbbe)
FROM tablea a
LEFT JOIN tableb b ON a.fe = b.tbbe AND b.tbbd = 1
GROUP BY a.fa, a.fb;

这是一个SQL Fiddle 示例。

【讨论】:

  • 请注意,最好按查询中的所有非聚合列分组。在此示例中,请注意我是如何按 (a.fa, a.fb) 而不仅仅是 a.fa 进行分组的。
【解决方案2】:

如果 b.tbbd 仅是 0 或 1,那么您可以使用 SUM() 而不是 COUNT(),这将排除 tbbd = 0 的行。

SELECT a.fa , a.fb , SUM( b.tbbe) 
FROM  tablea a
LEFT JOIN tableb b ON a.fe = b.tbbe
GROUP BY a.fa

如果 b.tbbd 可以是任何数字,但您只是在寻找等于 1 的行,那么只需将 AND 添加到您的 ON 子句

SELECT a.fa , a.fb , COUNT( b.tbbe) 
FROM  tablea a
LEFT JOIN tableb b ON a.fe = b.tbbe AND b.tbbd = 1
GROUP BY a.fa

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-17
    • 2019-11-19
    • 1970-01-01
    • 2012-04-24
    相关资源
    最近更新 更多