簡體   English   中英

MYSQL查詢問題-無法解決

[英]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我只想出現一次。 像這樣:

筆記本電腦

  • 生命值
  • 了索尼
  • 宏cer

硬碟

  • 西部數據
  • 希捷
  • 等等

所以通常我會這樣查詢(老式)

$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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM