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=kと仮定すると、結果は次のようになります。

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した場合、上記の 2 つのアドレスは表示されません。これだけが表示され-->kensington, sydneyます。これどうやってするの?

4

1 に答える 1

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

ここでフィドルを参照してください。

編集

元の形式で行を返すこれを使用することもできます。

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
于 2013-04-06T14:04:12.897 に答える