1

次のような複数のテーブルクエリがあります。

SELECT tree.name, tree.type, branch.name, branch.type, leaf.name, leaf.type 
FROM tree, branch, leaf 
WHERE leaf.branch_id = branch.id 
   AND branch.tree_id = tree.id
ORDER by field(tree.type, 'Poplar', 'Birch', 'Hazelnut')

したがって、これにより、3つのツリーエントリのいずれかに属するすべてのリーフエントリが得られます。

さて、私は本当に、指定された順序で、1つのツリーに属するリーフエントリのみを返したいと思います。

したがって、ポプラの木に属する葉のエントリがある場合は、それらのみを表示します。ただし、ポプラの葉のエントリがない場合は、白樺の木に属する葉のエントリのみを表示します。

リーフエントリはいくつあってもかまいません。優先リストに表示されるツリーにあるものが欲しいだけです。理想的には、1つのクエリを使用するだけです。

何か案は?前もって感謝します....

4

3 に答える 3

0

http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_find-in-setを使用することをお勧めします

それでできること

    SELECT * FROM (
    SELECT find_in_set(tree.type, "Poplar,Birch,Hazelnut") as sequence, tree.name, tree.type,    branch.name, branch.type, leaf.name, leaf.type 
    FROM tree, branch, leaf 
    WHERE leaf.branch_id = branch.id 
       AND branch.tree_id = tree.id
    ORDER by sequence
    ) WHERE sequence = 1
于 2012-08-16T10:50:09.000 に答える
0

ここにそれを行う1つの方法があります。このクエリは、最初に各リーフの適切なツリー タイプを見つけます。次に、この情報を結合して戻します。

select tree.name, tree.type, branch.name, branch.type, leaf.name, leaf.type
from (SELECT leaf.id,
             min(case when tree.type = 'Poplar' then tree.id end) as poplarid,
             min(case when tree.type = 'Birch' then tree.id end) as birchid,
             min(case when tree.type = 'Hazelnut' then tree.id end) as hazelid
      FROM leaf join
           branch
           on leaf.branch_id = branch.id join
           tree
           on branch.tree_id = tree.id join
      group by leaf.id
     ) lt join
     leaf
     on leaf.leaf_id = lt.leaf_id join
     branch
     on leaf.branch_id = branch.id join
     tree
     on tree.id = branch.tree_id
where tree.id = coalesce(lt.poplarid, lt.birchid, lt.hazelid)
ORDER by field(tree.type, 'Poplar', 'Birch', 'Hazelnut')
于 2012-08-16T10:51:38.890 に答える
0

これを試して:

SELECT * FROM
(
    SELECT tree.name, tree.type, branch.name, branch.type, leaf.name, leaf.type, 
           IF(@var_type = '' OR a.type = @var_type, a.type := @var_type, 0) AS check_flag
    FROM tree, branch, leaf, (SELECT @var_type := '')
    WHERE leaf.branch_id = branch.id
          AND branch.tree_id = tree.id
    ORDER by field(tree.type, 'Poplar', 'Birch', 'Hazelnut')
) a
WHERE check_flag <> 0;
于 2012-08-16T10:47:28.370 に答える