2

ユニオンを使用すると、列名が間違ってしまいます。

これが私がしていることです。同じ構造で異なるレコードを持つ2つの非常に大きなテーブルがあるので、ここにあります。

mysql> select * from e18 where `15` like '%car%' limit 1;
+------+------+----+------+------+------+------+------+------+------+------+------+------+------+------+-------------+------+------+------+------+------+------+--------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+-----------+
| id   | 1    | 2  | 3    | 4    | 5    | 6    | 7    | 8    | 9    | 10   | 11   | 12   | 13   | 14   | 15          | 16   | 17   | 18   | 19   | 20   | 21   | 22     | 23   | 24   | 25   | 26   | 27   | 28   | 29   | 30   | 31   | 32   | 33   | 34   | 35   | 36   | 37   | 38        |
+------+------+----+------+------+------+------+------+------+------+------+------+------+------+------+-------------+------+------+------+------+------+------+--------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+-----------+
| 2730 | 2730 | 18 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | cars: stuff | NULL | NULL | NULL | NULL | NULL | NULL |  5  1  | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | yy        |
+------+------+----+------+------+------+------+------+------+------+------+------+------+------+------+-------------+------+------+------+------+------+------+------+--------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+-----------+
1 row in set

mysql> (select * from e8 where `15` like '%car%') union
(select * from e10 where `15` like '%car%') union
(select * from e18 where `15` like '%car%') limit 1;");
+------+------+----+------+------+------+------+------+------+------+------+------+------+------+------+------+-------------+------+------+------+------+------+------+------+--------+------+------+------+------+------+------+------+------+------+------+------+------+------+-----------+
| id   | 1    | 2  | 3    | 4    | 5    | 6    | 7    | 8    | 9    | 10   | 11   | 12   | 13   | 14   | 16   | 17          | 18   | 19   | 20   | 21   | 22   | 23   | 24   | 25     | 26   | 27   | 28   | 29   | 30   | 31   | 32   | 33   | 34   | 35   | 36   | 37   | 38   | 15        |
+------+------+----+------+------+------+------+------+------+------+------+------+------+------+------+------+-------------+------+------+------+------+------+------+------+--------+------+------+------+------+------+------+------+------+------+------+------+------+------+-----------+
| 2730 | 2730 | 18 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | cars: stuff | NULL | NULL | NULL | NULL | NULL | NULL | NULL |  5  1  | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | yy        |
+------+------+----+------+------+------+------+------+------+------+------+------+------+------+------+------+-------------+------+------+------+------+------+------+------+--------+------+------+------+------+------+------+------+------+------+------+------+------+------+-----------+
1 row in set

この場合、unionallとunionは同じ結果を返します。

「car」という単語部分が含まれる行は1つだけで、表e18にあります。

何らかの理由で、usionを使用して得られた結果の列名がめちゃくちゃになっていて、何かが足りないように見えますが、それが何であるかについてのアイデアはありますか?

前もって感謝します。

4

2 に答える 2

4

ユニオンは、名前ではなく列の位置で機能します。ただし、列の位置を指定していない*のは、データベースによって選択されたが、選択されていない順序であるためです。

最終結果セットの名前は、共用体の最初のクエリの列の名前です。

修正は簡単です。必要なすべての列の名前を書き出し、3つのクエリすべての間で順序が一貫していることを確認してください。

列は名前で並べ替えられていません(したがって、列の名前を変更しても役に立ちません)。順序はデータベース内の内部順序です。

使用*は不適切な方法と見なされます。何を取得しているのかわからないため、一部の列のみが必要な場合は、使用*すると必要以上のデータが取得され、処理速度が低下します。

ところで、このような(番号による)列の命名は、プログラミングの実践としては非常に貧弱です。いったいどうやって物事をまっすぐに保つのですか?列には番号があり、テーブルには番号があります。難読化されたコードを書き込もうとしていますか?他の誰もあなたのコードで作業できないようにするには?もしそうなら、これはそれを行う一つの方法だからです。

于 2012-08-13T14:15:19.867 に答える
0

最初のクエリでは、フィールド15は他のフィールドと番号順になっているようです。2番目のクエリでは、最後に表示されます。必要なフィールドを指定すれば(そうです、入力が多いことはわかっています)、この問題は発生しません。

次に、リターンセット内のNULLの数と、同じ種類のデータを格納するために複数のテーブルを使用しているという事実を考えると、データはおそらく十分に正規化されていません。データベースを正規化すると、データベースの使用がはるかに簡単になります(また、より高速で効率的になります)。

そして第三に、合理的なフィールド名で15はありません-特に兄弟フィールドが他の番号で名前が付けられている場合はそうではありません。

于 2012-07-30T13:13:07.950 に答える