4

この質問が尋ねられて回答された場合は、私を許してください。検索して似たようなものをいくつか見つけましたが、SQLの初心者すぎて、それらを自分のニーズに合わせることができません。また、正しい用語を使用していない場合はご容赦ください.

<2nd EDIT Mar22:>

ソースデータが実際にどのように見えるか理解できませんでした。そのため、必要なものを取得できませんでした。ここに投稿する実際のソーステーブルを取得するように私をプッシュしてくれた@goranに感謝します(簡単に表示して無実の人を保護するために適切に編集するのが面倒なので、まだ投稿するつもりはありませんが、少なくとも質問する前にそれらを印刷してください)。以下は新しく改訂された表の例ですが、すべてを 1 行にまとめるという最終目標を達成する方法はまだわかりません。

テーブル 1:

id  name          total
5   John Doe      20

table_two:

id  product_id    price
5   51            17

テーブル 3:

id  text       number
5   Subtotal   17
5   Tax        3
5   Total      20

私が探しているのは次のようなものです:

id name     total product_id price text     number text number text   number
5  John Doe 20    51         17    Subtotal 17     Tax  3      Total  20

以下の情報がどれほど有効かはわかりませんが、質問の新しい読者をあまり混乱させないことを願って、ここに残しておきます.

</編集 3 月 22 日>

友人がデータを収集するのを手伝っていて、レコードごとに 1 つの行になるクエリを実行する必要がありますが、代わりに複数の行が得られます。これは、私が現在クエリしているものの例です (簡略化されていますが、あまり多くないことを願っています):

SELECT * FROM `table_one` AS t1 
INNER JOIN `table_two` AS t2 ON t1.id = t2.id 
INNER JOIN `table_three` AS t3 ON t1.id = t3.id 
WHERE 1

結果は次のとおりです。

id  text       number
5   Subtotal   17
5   Tax        3
5   Total      20

必要なのは、次のような結果になるクエリを作成することです。

id  text       number  text  number  text   number
5   subtotal   17      Tax   3       Total  20

任意の支援/ガイダンスをいただければ幸いです。

ありがとう!

--ジェド

4

3 に答える 3

4

どこかで単純化しすぎたと思います。引用するクエリは、すでに必要なものを正確に返します。次に例を示します(単一のテーブルから2回選択すると、現在と同様の状況になります)

mysql> select * from test t1 join test t2 on t1.a = t2.a LIMIT 1,5;
+------+------+------+------+
| a    | b    | a    | b    |
+------+------+------+------+
|    1 |    2 |    1 |    1 | 
|    1 |    1 |    1 |    2 | 
|    1 |    2 |    1 |    2 | 
|    2 |    2 |    2 |    2 | 
|    2 |    2 |    2 |    2 | 
+------+------+------+------+
5 rows in set (0.00 sec)

Mysqlは、結果セットの列に同じラベルを付けるのに問題はありません。元のクエリでは、選択した部分にt1。*が選択されていたと思います。

名前があいまいな個々のフィールドを参照する場合は、次のようになります。

mysql> select a from test t1 join test t2 on t1.a = t2.a LIMIT 1,5;
ERROR 1052 (23000): Column 'a' in field list is ambiguous

そして、あなたはあなたが望むものを正確に指定する必要があります(列のエイリアスはオプションです、あなたはt1。、t2。も行うことができます)

mysql> select t1.a first, t2.a second from test t1 join test t2 on t1.a = t2.a LIMIT 1,5;
+-------+--------+
| first | second |
+-------+--------+
|     1 |      1 | 
|     1 |      1 | 
|     1 |      1 | 
|     2 |      2 | 
|     2 |      2 | 
+-------+--------+
5 rows in set (0.00 sec)

22MARの編集サンプルデータを変更した後、1つのテーブルの複数の行を1つに変換したいようです。これが特定の解決策です(常にTax、Total、およびSubtotalの行があり、これらの行にのみ関心があると仮定します)。

SELECT t1.id, t1.name, t2.product_id, t2.price, t3a.number subtotal, t3b.number total, t3c.number tax
FROM `table_one` AS t1 
INNER JOIN `table_two` AS t2 ON t1.id = t2.id 
INNER JOIN `table_three` AS t3a ON t1.id = t3a.id and t3a.text = "Subtotal"
INNER JOIN `table_three` AS t3b on t3a.id = t3b.id and t3b.text = "Total"
INNER JOIN `table_three` AS t3c on t3b.id = t3c.id and t3c.text = "Tax"

(必要に応じて、選択部分で定数「Tax」、「Total」、および「Subtotal」を選択し、それらにいくつかの列名を付けることもできます)

不明な点の1つは、テーブル内のID間の関係です。これらはtable_oneまたはtable_twoの主キーです。もちろん、table_oneとtable_twoに複数の行がある場合、これは結果に影響を与える可能性があります。

于 2010-03-21T10:42:57.103 に答える
1

属性に一意の名前がないため、要求している出力はリレーションではありません。したがって、リレーショナルデータベースシステムがそのような結果を生成することを期待するのは不合理です。これは、一部のデータベースシステムがリレーショナルモデルを破り、場合によっては非リレーショナル結果を生成する可能性があるということではありません。しかし、これはそれらの1つではない可能性があります。

したがって、代わりに、アプリケーションでリレーションを入力として受け取り、それを目的の出力に変換する必要があります。RDBMSの観点からは、これがアプリケーションの役割の主要な部分です。

于 2010-03-21T01:03:55.040 に答える
1

少なくとも同じ名前の列があるため、必要な結果を正確に取得することはできません。おそらく、列の名前を変更することでこの結果を得ることができるかもしれませんが、この方法ではコードがハッキーになり、結果を適切に使用できなくなります。

select返されたレコードをさらに使用することを再検討し、SQLがデータを正常に返す方法になったらすぐに実際の結果を処理するために更新する必要があります。

于 2010-03-20T23:43:20.930 に答える