2012-05-28 27 views
1
table : category 
    | id + category_name + parent_category_id | 
    | 1 | Flower  |   0   | 
    | 2 | Wall Decor |   0   | 
    | 3 | Stylish Living|   0   | 
    | 4 | Mug   |   0   | 
    | 5 | Sun Flower |   1   | 
    | 6 | Balsam  |   1   | 

我嘗試列出數據與排序順序父類別第一,然後子類別。如何列出父級類別和子類別數據以適當的順序

Flower 
flower > Sun Flower 
flower > Balsam 
Wall Decor 
Stylish Living 
Mug  

因爲我嘗試我不能像上面那樣,下面是我得到的,花>太陽花和花>香脂應該在花下。

Flower 
Wall Decor 
Stylish Living 
Mug 
flower > Sun Flower 
flower > Balsam 

非常感謝,如果有人可以提供一些想法或解決方案。

+1

你能顯示你的查詢嗎? – dockeryZ

+0

請顯示您不存在的現有查詢。 – sdjuan

回答

1
SELECT category 
FROM (
    SELECT 
    IF(p.category_name is null, c.category_name, CONCAT(p.category_name, ' > ', c.category_name)) AS 'category' 
    FROM category c 
    LEFT JOIN category p ON c.parent_category_id = p.category_id 
) s 
ORDER BY category 

...是最好的我可以拿出你想要的結果。 See it working

+0

nice ..thanks .. :) – ruslyrossi

+0

CONCAT是做什麼的? – ruslyrossi

+1

@ruslyrossi ['CONCAT()'](http://dev.mysql.com/doc/refman/5.5/en/string-functions.html#function_concat)是串聯函數,它只是將字符串連接成一個。像PHP中的「」字符串1「。」字符串2「。 – DaveRandom

1

我有一個類似的結構,並利用這個變化:

SELECT 
    p.category_id, p.category_name, 
    c.category_id, c.category_name 
FROM category AS c 
JOIN category AS p ON (c.parent_category_id = p.category_id)  
ORDER BY p.category_name, c.category_name 

你可能有那種你一起的鼓搗使用(我知道應該/不應該有孩子),但它會給你所有的孩子類別與他們的父母,按你問的方式排序。

+0

我很確定你需要使用'left join',因爲父母不會有他們自己的父母,並且在加入過程中會被過濾掉 –

+0

ok ..我試試..這很有道理.. – ruslyrossi

+0

否懷疑一些過濾與WHERE的和JOINs的變化是爲了。我從代碼中複製的代碼段比這個代碼複雜得多,所以儘可能簡化它的起點。 – GDP

1

我終於明白了你到底在想什麼。這裏的SQL:

SELECT p.category_name as parent_category, '' as child_category 
FROM category AS p 
WHERE parent_category_id not in (select category_id from category) 
UNION 
SELECT p.category_name as parent_category, c.category_name as child_category 
FROM category AS p 
JOIN category AS c ON (c.parent_category_id = p.category_id) 
ORDER BY parent_category, child_category 

而這裏的輸出:

+-----------------+----------------+ 
| parent_category | child_category | 
+-----------------+----------------+ 
| Flower   |    | 
| Flower   | Balsam   | 
| Flower   | Sun Flower  | 
| Mug    |    | 
| Stylish Living |    | 
| Wall Decor  |    | 
+-----------------+----------------+ 

請注意,這只是想要爲一個2級的父子關係的工作。如果你有第三級,需要在三列中顯示,那麼它會變得更加複雜。

0

這是最好的答案,顯示一個列表和類別的子列表中有三個欄的ID,姓名,父ID

$con=mysqli_connect("localhost","root","","test"); 
$sql="select * from category where parent=0"; 
$result=mysqli_query($con,$sql); 
echo "<ol>"; 
while($row=mysqli_fetch_array($result)) 
{ 
    echo "<li >".$row['name']."</li>"; 
    abc($row['id']); 
} 

function abc($id) 
{ 
    global $con; 
    $sql="select * from category where parent=$id"; 
    $result=mysqli_query($con,$sql); 
    echo "<ol>"; 
    while($row=mysqli_fetch_array($result)) 
    { 
     echo "<li>".$row['name']."</li>"; 
     abc($row['id']); 
    } 
    echo "</ol>"; 
} 
echo "</ol>"; 

在此代碼中,我們通過父ID的功能,然後函數再次調用本身顯示子類別