0

すべての親を最初に表示してから子を表示するのではなく、すべての親とその子を表示するクエリを作成するにはどうすればよいですか。たとえば、現在、mySQL テーブルにはすべての COMPUTERS が表示され、次に DRIVES が表示されます。すべてのコンピューターに表示し、そのコンピューターに関連付けられているドライブを表示します。いいえ:

 COMPUTER   DRIVE        PID         ID 
 dell                    1 
 apple                   2
 apple                   3
 hp                      4
 hp                      5
            WD300FV                  1
            WD440GB                  1
            WD55                     2
            WD44X                    2...

すべてのコンピューターにそのドライブのリストが表示されるように、次のように表示します。

 COMPUTER   DRIVE        PID     
 dell                    1 
            WD300FV      1
            WD440GB      1
 apple                   2
            WD55         2
            WD44X        2
 apple                   3.....

コンピュータには親 ID があり、ドライブには ID があります。

このクエリを実行SELECT * FROM tableすると、表示したい行が作成されません。コンピュータを示すすべての行で、コンピュータの行の下にドライブのリストを表示したいと考えています。

4

2 に答える 2

1

あなたのテーブル構造に疑問があります。コンピューターとドライブは、2 つの異なるものであり、独自のプロパティを持つ可能性があるため、2 つの別個の関連するテーブルに配置する必要があると思います。

コンピュータテーブル:

computer_id |  manufacturer
---------------------------
1           |  dell
2           |  apple
3           |  hp

computer_id は、自動インクリメントの主キーになります

ドライブ テーブル:

drive_id   |  computer_id  |  name
-----------------------------------
1          |  1            | WD300FV
2          |  1            | WD440GB
3          |  2            | WD55
4          |  2            | WD44X
5          |  3            | XYZ

drive_id は自動インクリメントの主キーになります

computer_id にはインデックスがあります (InnoDB を使用していて、コンピューター テーブルとの関係を強制したい場合は、おそらく外部キー制約)

次に、次のようにクエリします。

SELECT c.computer_id, c.manufacturer, d.drive_id, d.name
FROM computer AS c
INNER JOIN drive AS d ON c.computer_id = d.computer_id
ORDER BY c.computer_id ASC, d.drive_id ASC

なんらかの理由で、私が提案したような正規化された構造を使用したくなく、代わりに既に持っているものと同様の非正規化された構造を使用する場合は、少なくとも非正規化をより多くの方法で行うことを検討する必要があります。正気の方法。pid次のようにテーブルを構成するだけであれば、ロジックはまったく必要ありません。

computer  |  drive
------------------
dell      | WD300FV
dell      | WD4440GB
apple     | WD55
apple     | WD44X
hp        | XYZ

そこにある必要のないレベルの複雑さを追加しているだけです。結果を「コンピューター」で簡単に並べ替えることができます。

SELECT computer, drive FROM table
ORDER BY computer ASC, drive ASC

スキーマをまったく変更しないと、次のようにクエリできます。

SELECT computer, drive, CASE WHEN pid = '' THEN id ELSE pid END as `sort_id`
FROM table
ORDER BY `sort_id` ASC, drive ASC
于 2012-12-27T21:25:07.260 に答える
0

必要な順序で行を取得するには、これを使用できます。

select
  computer,
  drive,
  coalesce(pid, id)
from
  your_table
order by
  coalesce(pid, id), computer is null, drive is not null

これは行をpidor (null の場合pid) で並べ替えid、computer が null でない行を一番上に配置し (computer is nullが false の場合は 0、true の場合は 1 と評価されるため)、次にドライブが null の行を一番上に配置します。 .

(もちろん、コンピューターとドライブを同時に null にすることができない場合は、 だけで注文できますcomputer is null)

次の order by 句を検討することもできます。

order by coalesce(pid, id), computer is null, computer, drive is not null, drive
于 2012-12-27T22:36:41.390 に答える