2009-05-12 15 views
0

私は人の単純なテーブルを持つSQLiteデータベースを持っています。子供が親のためにグループ化されている人

各行は人を表し、プライマリキー(id)、名前、1つは年齢、1つは親のための4つの列を持ちます(プライマリIDを指します。 )。

ここでは、年齢順にソートされたすべての人をリストアップし、その子供をその親と一緒にグループ化する必要があります。例えば

:(名前、年齢)

 
Dan, 18 
Eva, 21 
- Bill, 4 
- Bull, 7 

Steve, 38 
Richard, 63 
- Ann, 19 
- Clara, 39 

Vera, 70 

これは簡単に聞こえるが、私は事前に
おかげ:-(SQL文を把握することはできません

/ジョン・

+0

男...あなたは本当にあなたのDBから2つの最も奇妙なカップルを例として選択しなければなりませんでしたか? :) – Tomalak

答えて

0

私はあなたが2つのクエリにこれを分割することをお勧めします。

SELECT Child.* 
FROM Persons AS Child 
    JOIN Persons AS Parent ON (Parent.id = Child.parent) 
ORDER BY (Parent.age, Parent.id, Child.age, Child.id) 

二つのリストは、簡単に彼ら以来id/parentにマージすることができます。

SELECT * 
FROM Persons 
WHERE id IN (SELECT parent FROM Persons) 
ORDER BY (age, id) 

が続いて子供の適切ソートされたリストを取得します:

まず、両親のリストを取得両方とも親のageによって最初にソートされます。

1

! 1つのレベルの深さが必要な場合は、次のようにすることができます。

SELECT CONCAT(CASE WHEN parent IS NOT NULL THEN '- ' ELSE '' END, name), age 
FROM table 
ORDER BY 
     CASE WHEN parent IS NOT NULL THEN parent ELSE id END, parent IS NOT NULL 

階層全体を構築したい場合は、それが難しくなります。

更新:質問タグは最初にMySQLとなっているので、回答はMySQLと関連しています。

答えは残しておきますが、SQLiteでは機能しません。

MySQLにはネイティブサポートがありませんので、特別な機能をいくつか作成する必要があります。

は、詳細については、私のブログでこの記事を参照してください。一言で言えば

CREATE FUNCTION hierarchy_connect_by_parent_eq_prior_id(value INT) RETURNS INT 
NOT DETERMINISTIC 
READS SQL DATA 
BEGIN 
     DECLARE _id INT; 
     DECLARE _parent INT; 
     DECLARE _next INT; 
     DECLARE CONTINUE HANDLER FOR NOT FOUND SET @id = NULL; 

     SET _parent = @id; 
     SET _id = -1; 

     IF @id IS NULL THEN 
       RETURN NULL; 
     END IF; 

     LOOP 
       SELECT MIN(id) 
       INTO @id 
       FROM t_hierarchy 
       WHERE parent = _parent 
         AND id > _id; 
       IF @id IS NOT NULL OR _parent = @start_with THEN 
         SET @level = @level + 1; 
         RETURN @id; 
       END IF; 
       SET @level := @level - 1; 
       SELECT id, parent 
       INTO _id, _parent 
       FROM t_hierarchy 
       WHERE id = _parent; 
     END LOOP; 
END 

SELECT CONCAT(REPEAT(' ', level - 1), CAST(hi.id AS CHAR)) AS treeitem, parent, level 
FROM (
     SELECT hierarchy_connect_by_parent_eq_prior_id(id) AS id, @level AS level 
     FROM (
       SELECT @start_with := 0, 
         @id := @start_with, 
         @level := 0 
       ) vars, t_hierarchy 
     WHERE @id IS NOT NULL 
     ) ho 
JOIN t_hierarchy hi 
ON  hi.id = ho.id 
+0

彼はMySQLではなくSQLiteを使用しています。私はなぜタグがmysqlを言ったのかわかりません。 –

+0

+1列の値に応じて注文を使用できるかどうかはわかりませんでした。 –

関連する問題