dongliao3450 2014-03-12 02:14
浏览 40
已采纳

SQL - 在单个查询中计算多个列和JOIN

I'm trying to get the count the number of fields (AAA - ZZZ) that have a value other than 'N/A' from a single row to display alongside the basic info. I have 2 queries that separately work find as SQL commands, but I'm looking to merge them together to work in the foreach statement.

Table structure:

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

For example, using the info above, the count would be:

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

PHP Table Code:

    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>';
         }
}

Retrieval query:

$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";

Alternative query:

$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";

Count Query: Note that the ID=1 should be the id from the first query:

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

I've looked into joins, and other workarounds, but to little luck. Thanks in advance for your help :)

  • 写回答

1条回答 默认 最新

  • duanbiyi7319 2014-03-12 02:57
    关注

    The following should get you the count of non-N/A fields in a single query.

       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
    

    I set up a SqlFiddle to play with this a bit here: http://sqlfiddle.com/#!2/d6990/5

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 关于#java#的问题,请各位专家解答!
  • ¥15 急matlab编程仿真二阶震荡系统
  • ¥20 TEC-9的数据通路实验
  • ¥15 ue5 .3之前好好的现在只要是激活关卡就会崩溃
  • ¥50 MATLAB实现圆柱体容器内球形颗粒堆积
  • ¥15 python如何将动态的多个子列表,拼接后进行集合的交集
  • ¥20 vitis-ai量化基于pytorch框架下的yolov5模型
  • ¥15 如何实现H5在QQ平台上的二次分享卡片效果?
  • ¥30 求解达问题(有红包)
  • ¥15 请解包一个pak文件