Mysql
使用 COUNT 返回零條目的查詢
我對一項任務有疑問。我需要通過兩個不同的查詢來顯示各種資訊。(或者如果可能的話,一個)該表具有這些欄位。位置設置為 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
d
,y
則原始查詢的結果將是:+------------+------------+ | 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);
試一試 !!!