1

小さな内線電話番号リストを作成しています。

データベースには、peopleテーブルとテーブルの 2 つのテーブルがありnumbersます。関係はone-to-manyそれぞれです。

結果を 1 行に 1 人の人物を含む単一の HTML テーブルに表示したいのですが、複数の数字がある場合は、それらを単一の列に表示し、人の行に行スパンを追加して補正します。

さて、データベースから結果を取得するには、次のいずれかを実行できます。

(pseudocode)

SELECT id, name
FROM people

foreach result as row {
  SELECT number
  FROM numbers
  WHERE numbers.person_id = row['id']
}

これは、すべてのユーザーを取得するために 1 つのクエリを実行していることを意味しますが、100 人のユーザーがいる場合は、各ユーザーの数を取得するために 100 の追加クエリを実行することになります。

代わりに、次のようにすることができます。

(pseudocode)

SELECT number, person_id
FROM numbers

SELECT id, name
FROM people

foreach people as person {
  echo name
  foreach numbers as number {
    if (number.id = person.id) {
      echo number
    }
  }
}

したがって、基本的にはまったく同じことを行っていますが、代わりに 2 つのクエリを実行してすべての結果を配列に取得し、配列をループしてテーブルをフォーマットしています。

どの方法を使用する必要がありますか、またはこれを行うためのより良い方法はありますか?

4

5 に答える 5

4

おそらく、 1つのクエリだけを実行したいと思うでしょう。何かのようなもの

select people.id, people.name, group_concat(numbers.number)
from people 
inner join numbers on numbers.id = people.id
group by people.id, people.name
order by people.name

次に、単純なphpコードを使用して結果セットをループできます。

于 2012-10-18T20:05:51.590 に答える
4

一般的な方法は、通常の JOIN を行うことです。

SELECT id, name, number
FROM people, numbers
WHERE people.id = numbers.person_id;

を追加しORDER BYて番号を順番に取得するか、結果セットを 1 回パスして配列を作成し、その配列をループすることができます。

GROUP_CONCATを使用して、同じ人物のすべての番号を連結することもできます。

SELECT id, name, GROUP_CONCAT(number SEPARATOR ', ')
FROM people, numbers
WHERE people.id = numbers.person_id
GROUP BY people.id;

あなたもこの質問をしているので、データベース設計の入門書を手に取る必要があるという事実を強調することはできません. リレーショナル データベースの背後にある理論を学ぶことは、私を驚かせてくれました。

于 2012-10-18T20:04:53.463 に答える
1

それは場合によって異なります。時間をかけて確認する必要がある場合があります。データベースが Web サーバーとは別のコンピューター上にある場合、複数のクエリを実行すると多くのネットワーク ターンが発生するため、多くの場合、これには時間がかかります。ただし、データベース サーバーが Web サーバーと同じコンピューター上にある場合、これは問題にならない可能性があります。

また、配列内の数値を検索するのにかかる時間も考慮してください。配列として、線形順序 O(N) 検索を行っています。ハッシュに入れることができれば、ルックアップははるかに高速になり、2 つのクエリ アプローチは高速になる可能性がありますが、配列内の回答を検索するのに多くの時間を費やす場合はそうではありません。

結合を使用して 1 つのクエリにまとめると、foreach ループでアクセスするためにデータを格納しているコンテナー構造に応じて、数値が人に関連付けられるため、最速になる可能性があります。

于 2012-10-18T20:10:05.900 に答える
0

ストアドプロシージャまたは関数を使用してデータを取得します。プログラムでSQLを使用しないでください。

于 2012-10-18T20:05:20.463 に答える
0

どちらもしないでください。テーブルに対して1つのクエリ(結合)を実行できます。

select name, number
from people p, numbers n
where p.id = n.person_id
order by name, number;

そして、たった1つのループ:

$link = mysqli_connect(...);
$query = 'select name, number from people p, numbers n where p.id = n.person_id order by name, number';

if ($result = mysqli_query($link, $query)) {
    $person = '';
    while ($row = mysqli_fetch_array($result, MYSQLI_ASSOC)) {
        if ($row['name'] !== $person) {
            $person = $row['name'];
            echo $person;
        }

        echo $row['number'];
    }
}
于 2012-10-18T20:06:25.710 に答える