Mysql

使用 COUNT 返回零條目的查詢

  • June 16, 2015

我對一項任務有疑問。我需要通過兩個不同的查詢來顯示各種資訊。(或者如果可能的話,一個)該表具有這些欄位。位置設置為 x

+------------+------------+-------------+
| blocked    | type       | location    |
+------------+------------+-------------+
|          0 |          a |           x |
|          0 |          b |           x |
|          0 |          c |           x |
|          0 |          a |           x |
|          0 |          d |           x |
|          0 |          e |           x |
|          0 |          b |           x |
|          0 |          a |           x |
+------------+------------+-------------+

我的第一個查詢是獲取某些類型的所有條目

SELECT COUNT( * ) AS  `how much` ,  `type`
FROM  table
WHERE  (`type`='a' OR `type`='b' or `type`='d')
AND `blocked`='0'
GROUP BY   `type`
ORDER BY   `type` 

這給了我

+------------+------------+
| how much   | type       |
+------------+------------+
|          3 |          a |
|          2 |          b |
|          2 |          d |
+------------+------------+

接下來我需要獲取具有特定位置的條目

SELECT COUNT( * ) AS  `how much` ,  `type`
FROM  table
WHERE  (`type`='a' OR `type`='b' or `type`='d')
AND `blocked`='0'
AND `location`='y'
GROUP BY   `type`
ORDER BY   `type` 

這不會返回任何內容,因為一切都設置為 x。

我需要查詢返回零或正確的值。因此,如果我將位置設置為 1 dy則原始查詢的結果將是:

+------------+------------+
| how much   | type       |
+------------+------------+
|          1 |          d |
+------------+------------+

我需要它是:

+------------+------------+
| how much   | type       |
+------------+------------+
|          0 |          a |
|          0 |          b |
|          1 |          d |
+------------+------------+

那是因為我使用 php 顯示結果。第一個查詢的值在一個 while 循環中儲存到兩個不同的數組中,第二個查詢在另一個 while 循環中儲存到第三個數組中。比它們通過 for 循環顯示

因此,目前的查詢將導致這個

+------------+-------------------+--------------------------+
| type       | how much records  | how much in location y   |
+------------+-------------------+--------------------------+
|          a |                 3 |                        1 |
|          b |                 2 |                          |
|          d |                 2 |                          |
+------------+-------------------+--------------------------+

而不是這個

+------------+-------------------+--------------------------+
| type       | how much records  | how much in location y   |
+------------+-------------------+--------------------------+
|          a |                 3 |                        0 |
|          b |                 2 |                        0 |
|          d |                 2 |                        1 |
+------------+-------------------+--------------------------+

非常感謝您的幫助。

編輯:查詢:

$query_1 = $conn->query("SELECT COUNT( * ) AS how_much, type FROM table WHERE (type='a' or type='b' or type='d') AND blocked='0' GROUP BY type ORDER by type") or trigger_error($conn->error);
$query_2 = $conn->query("SELECT COUNT( * ) AS how_much, type FROM table WHERE (type='a' or type='b' or type='d') AND blocked='0' AND location='y' GROUP BY type ORDER by type") or trigger_error($conn->error);
$query_max = $conn->query("SELECT COUNT( * ) AS maximum FROM (SELECT COUNT( * ) AS how_much, type FROM table WHERE (type='a' or type='b' or type='d') AND blocked='0' GROUP BY type ORDER by type) AS max") or trigger_error($conn->error);
$max_entries = mysqli_fetch_array($query_max);

數組:

while($row_1 = mysqli_fetch_array($query_1))
{       
$types[]= $row_1["type"];
$how_many_entries[]= $row_1["how_much"];
}

while($row_2 = mysqli_fetch_array($query_2))
{       
$how_many_in_location[]= $row_2["how_much"];
}

列印出來:

echo ("<table border='1' align='center'>
        <tr><td colspan='3'>Types a,b,c</td></tr>
        <tr><td>Types</td><td>How many entries</td><td>How Many in Location</td></tr>");

for($i=0;$i<$max_entries[0];$i++)
     {echo("<tr>
              <td><a href=some_url.php?menu=".$types[$i].">".$types[$i]."</a></td>
              <td>".$how_many_entries[$i]."</td>
              <td>".$how_many_in_location[$i]."</td>
             </tr>");

所以我認為最好不重寫大部分內容是編輯 $query_2 以包含 0 值

我理解您的問題的方式是,由於 a 和 b 的數組沒有“位置 y”的值,因此循環“跳過”它並在第一個打開的行中顯示 d 的值 1。

您可以嘗試提取所有數組的位置(甚至是非 y 值),然後使用 if 語句顯示 0 或您想要的結果。

您也可以嘗試將所有內容放入一個 for 循環中,並且沒有 y 位置的數組輸出 0。

此外,嘗試查看 isset(); 在 php 中為那些沒有獲取位置的數組提供函式。

如果您發布用於提取和顯示結果的程式碼,我們可能會提供更好/更準確的建議。

您不需要在 PHP 中進行任何循環

只需使用單個聚合查詢

SELECT COUNT(B.type) "how much",A.type
FROM
(SELECT 'a' type UNION SELECT 'b' UNION SELECT 'c') A
LEFT JOIN
(SELECT type FROM table WHERE `blocked`='0' AND `location`='y') B
USING (type)
GROUP BY A.type
ORDER BY A.type;

子查詢A本質上是一個類型數組

我還將按阻塞、位置和類型索引表以加快子查詢B

ALTER TABLE table ADD INDEX blocked_location_type_ndx (blocked,location,type);

試一試 !!!

引用自:https://dba.stackexchange.com/questions/103919