2016-04-19 10 views
0

クエリデータについての質問が縦型であるため、\ gまたは\ Gで試してみました。Mysqlクエリの垂直方向の " G"が機能しない

select * from mytable \G . Always wrong. 

は私がhttps://dev.mysql.com/doc/refman/5.5/en/mysql-tips.html

で "4.5.1.6.2クエリの結果を縦表示" しかし、それが動作し、 "\ G"

私のクエリでエラー構文が表示されない参照しましたそれで、次のような最終的なクエリを作成したいだけです。

Select "A","B","C","D" as "ColumnName" \G 

E xpect:

ColumnName  
A  
B  
C  
D 

私はUNIONまたはUNION ALLを試しました。数千のレコードでは、パフォーマンスが低下します。

とMySQLのバージョンは次のとおりです。5.6.17バージョン - サーバー - MySQL Community Serverが(GPL)

ベルントBuffen @

私は私のクエリを示しています。

Select C.* from 

(

    ( Select * from (Select "Value1" as newcolumn UNION ALL Select "Value2" as newcolumn UNION ALL ...<200.000 UNION ALL>) ) A 

left join 

(SELECT key,column1,column2,colum3 FROM supplier) B 

on A.newcolumn = B.key 

) C 

し、データベースにクエリを処理、私は開始から終了までの時間をデバッグし、それは1.30から2分を費やします。それは良くない。

+0

それだけのオリジナルmysqlクライアント –

+0

にあなたはそれだけで後ろのコードに実行平均で動作します。 – thanhlong

答えて

2

プログラミングAPI(phpMyAdminのまたはMySQLのGUI等であっても別のプログラム)から使用された場合、\ Gと\ G機能がちょうど(コメント欄で述べたように。)コマンド・ライン・クライアントの特徴

のMySQLであります\ gまたは\ Gはサポートされていません。データを「表示」することさえできません。表示はGUIプログラムによって行われます。

ただし、このクエリ走った場合でも、コマンドラインクライアントで

SELECT 'A', 'B', 'C', 'D' AS "ColumnName"\G 

を、それが実際に生成します:

*************************** 1. row *************************** 
     A: A 
     B: B 
     C: C 
ColumnName: D 
1 row in set (0.01 sec) 

あなたがそのクエリに4列を選択しているためです最後の列名は「ColumnName」のみとなります。

あなたがテーブルの行を見たい場合は、実行します:

SELECT * 
FROM table_name\G 

をそして、それは、その後、各列、:、その値を一覧表示します。

しかし、これはコマンドラインクライアントでのみ機能します。

プログラミングAPIを使用してデータベースから値を取得したい場合は、問題は明らかにやや難解です。たとえば、ユニオンがあなたの望むものになります。例:

SELECT 'column_name_1' AS key, GROUP_CONCAT(column_name_1) AS value 
FROM table_name 
UNION ALL 
SELECT 'column_name_2' AS key, GROUP_CONCAT(column_name_2) AS value 
FROM table_name 

はい、効率的ではありません。

これは実際にデータベースを使用する方法ではなく、データの表として使用するためのものです。私はあなたがMySQLからそれを取得した後、あなたはこのフォーマットにデータを変更することをお勧めします。これは配列などで行うことができます。

+0

ありがとうございます。ステートメント\ Gについて、私はコマンドラインでしか動作していないことを理解しました。あなたの最後の声明sqlについて私はそれを試しましたが、私はすべてを使用することはできませんが、それは大丈夫ですが、200.000レコードよりもループすると、エラーが発生してより多くの時間が失われ、Webサイトではレスポンスが500 – thanhlong

+0

になります。実際にこれを行う必要がある場合は、テーブルから(行形式で)*をプルダウンしてから、バッファにデータを転置することをお勧めします( –

0

もう1つのサンプルがあります。

DROP TEMPORARY TABLE IF EXISTS TMPV; 
CREATE TEMPORARY TABLE `TMPV` (
    `newcolumn` VARCHAR(32) NOT NULL DEFAULT '', 
    PRIMARY KEY (`newcolumn`) 
) ENGINE=INNODB DEFAULT CHARSET=utf8; 

INSERT INTO `TMPV` VALUES ('Value1'),('Value2'),('Value3'),('Value4'),('Value5'),('Value6'); 


SELECT A.*, s.`key`, s.`column1`, s.`column2`, s.`column2` 
FROM `TMPV` A 
LEFT JOIN supplier s 
    ON A.newcolumn = s.key; 
+0

)。私はAPIでそれが必要です。ありがとうございます。 – thanhlong

+0

@thanhlong - 私は自分の答えを変更しましたが、なぜあなたはこれをやりたいのですか?わかりません –

+0

私はすべての声明についてあなたに同意します。しかし、もし私が200.000件のレコードを持っていれば、Union Allはすべてのアイテムを結合するとき(2〜3分以上、Webサイトにはエラー500で、レスポンスではなく)パフォーマンスが低下します。 200.000のレコードを200.000個のレコードから200,000個のレコードに結合したいのですが、別のテーブルがデータベースに存在するので、yes-> left joinと200.000のレコードをすべて取得します。おそらく200.000以上です。 – thanhlong

関連する問題