[英]MYSQL query problem - can't figure it out
嗨,我有個大問題……聽起來很簡單,但實際上非常復雜
我有兩個mysql表:
info_cat (id, name)
info_subcat (id, id_info_cat, name)
我想向用戶顯示info_cat.name
然后再顯示info_subcat.name
但問題是info_cat.name
我只想出現一次。 像這樣:
筆記本電腦
硬碟
所以通常我會這樣查詢(老式)
$query = mysql_query("SELECT * FROM info_cat");
while ($row = mysql_fetch_assoc($query)) {
$id_info_cat = $row['id'];
echo $row['name'];
$query2 = mysql_query("SELECT * FROM info_subcat WHERE id_info_cat = '$id_info_cat'");
while($row2 = mysql_fetch_assoc($query2)) {
echo $row2['nume'];
}
}
我有while within while
。 我的問題是我如何僅使用查詢來完成此操作(我認為使用JOIN)? 我已經嘗試了以下命令:
SELECT info_cat.name, info_subcat.name AS name2, info_subcat.id FROM info_cat, info_subcat WHERE info_cat.id = info_subcat.id_info_cat;
但無法弄清楚如何處理數據,因為它將輸出:
name name2 id
Laptop Acer 1
Laptop HP 2
Laptop Sony 3
HDD Western Digital 4
HDD Seagate 5
HDD ETC 6
我只想回顯一次筆記本電腦,一次回顯HDD,然后再回顯其子類別名稱。 我怎樣才能做到這一點 ?
Pleaseee ....
謝謝
當嵌套循環完美地描述問題(列表中的列表)時,嵌套while循環並沒有錯。 但是,如果您想不惜一切代價避免嵌套while循環,則可以執行以下操作:
$query = mysql_query("
SELECT ic.name ic_name, isc.name isc_name
FROM info_cat ic
LEFT JOIN info_subcat isc
ON ic.id = isc.id_info_cat
ORDER BY ic_name ASC");
$last_cat = '';
while ($row = mysql_fetch_assoc($query)) {
if($row['ic_name'] != $last_cat) {
echo $row['ic_name'];
$last_cat = $row['ic_name'];
}
echo $row['name'];
}
可以在不使用ORDER BY
語句的情況下編寫上述查詢,這會提高性能。 使用ORDER BY
更加明確,並且可以保證(SQL標准不規定行的特定順序,可以是任何東西)結果集的正確順序和輸出(盡管mysql通常會執行您期望的操作)。
在查詢中使用分組依據
SELECT info_cat.name, info_subcat.name AS name2, info_subcat.id FROM info_cat inner join info_subcat on info_cat.id = info_subcat.id_info_cat
group by info_cat.name
order by info_cat.name desc
然后在您的while循環中,執行if檢查以查看info_cat名稱=最后一個info_cat名稱,如果兩者相等,則不要添加它,否則添加它,例如(這是下面的psedocode)
$lastInfoCatName = $row['name'];
while ($row != null)
{
if ($lastInfoCatName != $row['name']
{
$lastInfoCatName = $row['name']
//work on creating the table
}
嘗試使用GROUP BY和GROUP_CONCAT。
SELECT
info_cat.name,
GROUP_CONCAT(info_subcat.name ORDER BY info_subcat.name SEPARATOR ', ')
FROM
info_cat
LEFT JOIN
info_subcat ON (info_car.id = info_subcat.id_info_cat)
GROUP BY
info_cat.id
有兩種方法可以做到這一點。 為了完整起見,我將兩者都列出。
方法1
$query = <<<SQL
SELECT
ic.name catname
, is.name subcatname
FROM
info_cat ic
JOIN info_subcat is ON (ic.id = is.info_cat_id)
SQL;
$result = mysql_query($query);
$cats = array();
while ($row = mysql_fetch_object($result)) {
if ( ! isset($cats[$result->catname]) ) {
$cats[$result->catname] = array();
}
$cats[$result->catname][] = $result->subcatname;
}
foreach ($cats as $catname => $subcats) {
echo "$catname<br /> <ul>";
foreach ($subcats as $subcat) {
echo "<li>$subcat</li>";
}
echo "</ul>";
}
方法#2
$query = <<<SQL
SELECT
ic.name catname,
GROUP_CONCAT(is.name) subcatnames
FROM
info_cat ic
JOIN info_subcat is ON (ic.id = is.info_cat_id)
SQL;
$result = mysql_query($query);
while ($row = mysql_fetch_object($result)) {
echo "$row->name<br /><ul>"
foreach (explode(',', $row->subcatnames) as $subcatname) {
echo "<li>$subcatname</li>";
}
echo "</ul>";
}
由於其他所有人也會提出建議,因此您應該使用PDO和PHPTAL,並且在創建表時,應為“ id”列提供引用該表的名稱,例如“ icID”和“ isID”
您發布的結果看起來像mysql結果,而不是根據您的腳本輸出的php。
遍歷主要類別,它將回顯名稱,並遍歷其子類別,並回顯子名稱並繼續。
在您的示例中,沒有地方會產生這樣的輸出...
SELECT info_cat.name, GROUP_CONCAT(info_subcat.name) AS name2
FROM info_cat, info_subcat
WHERE info_cat.id = info_subcat.id_info_cat
GROUP BY info_cat.name;
conCAT! :)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.