2013-04-06 93 views
0

这是我的查询以不同的方式

 $query="SELECT parent.name, parent.depth 
     FROM address AS node, 
       address AS parent 
     WHERE node.name LIKE '%".$name."%' AND 
     node.lft BETWEEN parent.lft AND parent.rgt 
     order by node.lft, parent.rgt"; 

限制的结果,这是我的表结构:

name  |lft | rgt | depth| 
------------+----+-----+------+ 
Australia | 1 | 10 | 1 | 
nsw   | 2 | 9 | 2 | 
sydney  | 3 | 8 | 3 | 
kensington | 4 | 5 | 4 | 
kingsford | 6 | 7 | 4 | 
------------+----+-----+---- -+ 

让我们假设$name = 10k,则其结果将是

name  |depth| 
------------+-----+ 
kingsford | 4 | 
sydney  | 3 | 
nsw   | 2 | 
Australia | 1 | 
kensington | 4 | 
sydney  | 3 | 
nsw   | 2 | 
Australia | 1 | 

我将展示他们是这样的:

-->kensington, sydney, nsw, australia 
-->kingsford, sydney, nsw, australia 

我不能限制这顶多只涉及10个地址。如果我加入limit 2例如,它不会显示上述两个地址。它只会显示这个-->kensington, sydney。我怎样才能做到这一点?

回答

0

也许问题不是太清楚,但如果我理解正确的话,我会用这样的:

SELECT 
    GROUP_CONCAT(parent.name ORDER BY parent.depth DESC) AS name 
FROM 
    address AS node JOIN address AS parent 
    ON node.lft BETWEEN parent.lft AND parent.rgt 
WHERE node.name LIKE '%k%' 
GROUP BY node.name 
LIMIT 10 

请参阅小提琴here

编辑

你可能也想利用这一点,返回在原始格式的行:

SELECT 
    parent.name, parent.depth 
FROM 
    (SELECT name, lft FROM address WHERE name LIKE '%k%' LIMIT 10) AS node, 
    address AS parent 
WHERE 
    node.lft BETWEEN parent.lft AND parent.rgt 
order by node.lft, parent.rgt 
+0

为什么使用'SUBSTRING_INDEX'。它什么也没做。 http://sqlfiddle.com/#!2/89c87/4/0 – Sami 2013-04-06 15:09:42

+0

@Sami我用SUBSTRING_INDEX只得到逗号前的前10名,但查询返回的值小于10,你可以尝试用2看它是如何工作的?我不知道,如果它是这个正是你想要什么 – fthiella 2013-04-06 15:23:26

+0

非常感谢你对我的帮助。我为我可怜的解释 – Sami 2013-04-06 15:28:20