【问题标题】:SQL - Count Multiple columns and JOIN in a single querySQL - 在单个查询中计算多个列并加入
【发布时间】:2014-04-15 22:42:28
【问题描述】:

我正在尝试从单行中获取具有“N/A”以外的值的字段数(AAA - ZZZ),以显示在基本信息旁边。我有 2 个查询分别作为 SQL 命令工作,但我希望将它们合并在一起以在 foreach 语句中工作。

表结构:

ID  UserID  Date    Assignment  AAA BBB CCC DDD
1   1   1/27/2014   Test    5.25    N/A 4   N/A
2   4   1/27/2014   Test2   N/A N/A 3.5 2.75
3   1   1/29/2014   Test3   1.25    N/A N/A 4.5

例如,使用上面的信息,计数将是:

ID 1, Count = 3
ID 2, Count = 2
ID 3, Count = 1

PHP表格代码:

    foreach ($pdo->query($sql) as $row) {
         echo '<tr>';
         echo '<td>'. $row['Date'] . '</td>';
         echo '<td>'. $row['UserName'] . '</td>';
         echo '<td>'. $row['Assignment'] . '</td>';
         echo '<td>'. $row['Count'] . '</td>';
         echo '</tr>';
         }
}

检索查询:

$sql = "SELECT db_log.ID, CONCAT(db_users.FName, ' ', db_users.LName) AS UserName, db_log.Date, db_log.Assignment
FROM `db_log` 
INNER JOIN `db_users` ON 
db_log.UserID=db_users.ID 
ORDER BY `ID` DESC LIMIT 0,20";

替代查询:

$sql = "SELECT db_log.ID, CONCAT(db_users.FName, ' ', db_users.LName) AS UserName, db_log.Date, db_log.Assignment
FROM `db_log`, `db_users` 
WHERE db_log.UserID=db_users.ID 
ORDER BY `ID` DESC LIMIT 0,20";

计数查询: 请注意,ID=1 应该是第一个查询的 id:

SELECT COUNT(AAA) FROM (
SELECT `AAA` FROM `db_log` WHERE `AAA` <> 'N/A' AND `ID`=1 UNION ALL
SELECT `BBB` FROM `db_log` WHERE `BBB` <> 'N/A' AND `ID`=1 UNION ALL
SELECT `CCC` FROM `db_log` WHERE `CCC` <> 'N/A' AND `ID`=1 UNION ALL
SELECT `DDD` FROM `db_log` WHERE `DDD` <> 'N/A' AND `ID`=1 UNION ALL
SELECT `EEE` FROM `db_log` WHERE `EEE` <> 'N/A' AND `ID`=1) AS A

我研究了连接和其他解决方法,但运气不佳。提前感谢您的帮助:)

【问题讨论】:

  • 你需要一个来创建一个pivot queryThis is a really good tutorial 他们也是。
  • 你可以在 PHP 中做到这一点。:)
  • @ChristianMark 如果你用 PHP 来做,你会建议什么路线?我知道您可以取消设置所有“N/A”值,但您将如何计算所有其他匹配的列?

标签: php mysql sql join count


【解决方案1】:

以下内容应为您提供单个查询中非 N/A 字段的计数。

   SELECT id, CONCAT(db_users.FName, ' ', db_users.LName) AS UserName,
    (IF (aaa = 'N/A', 0, 1) + 
     IF (bbb = 'N/A', 0, 1) + 
     IF (ccc = 'N/A', 0, 1) + 
     IF (ddd = 'N/A', 0, 1) ) AS count
    FROM db_log
    JOIN db_users on db_log.userId = db_users.userId

我在这里设置了一个 SqlFiddle 来玩这个:http://sqlfiddle.com/#!2/d6990/5

【讨论】:

  • 工作出色,非常感谢!一个真正的 SQL 专家 - 如果我有代表,我会立即为你投票 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-19
  • 1970-01-01
  • 2021-06-08
  • 2015-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多