以不同的方式
问题描述:
这是我的查询以不同的方式
$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
。我怎样才能做到这一点?
答
也许问题不是太清楚,但如果我理解正确的话,我会用这样的:
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
为什么使用'SUBSTRING_INDEX'。它什么也没做。 http://sqlfiddle.com/#!2/89c87/4/0 – Sami 2013-04-06 15:09:42
@Sami我用SUBSTRING_INDEX只得到逗号前的前10名,但查询返回的值小于10,你可以尝试用2看它是如何工作的?我不知道,如果它是这个正是你想要什么 – fthiella 2013-04-06 15:23:26
非常感谢你对我的帮助。我为我可怜的解释 – Sami 2013-04-06 15:28:20