2016-12-29 23 views
0

4つのテーブルを使用してデータを取得しようとしています。テーブルの 一覧複数のテーブルで最適な方法でクエリ結果を返します

  • 番号
  • 通話
  • ref_label_no
  • ラベル

私は通話の番号の無いが、特定のラベルが添付データを取得したいです。 ここに表があります。
番号テーブル

select id,uuid,number from numbers limit 1; 
+----+--------------------------------------+------------+ 
| id | uuid         | number  | 
+----+--------------------------------------+------------+ 
| 1 | ed268b05-758e-44fd-b429-8d5223651814 | 1234561222 | 
+----+--------------------------------------+------------+ 

コール表

mysql> select id,uuid,did from calls limit 2; 
+----+-------------------------------------+------------+ 
| id | uuid        | number  | 
+----+-------------------------------------+------------+ 
| 1 | ddddass-b810-4f23-7456-8ff56efab080 | 1234561222 | 
| 2 | dddddd-b810-4f23-7456-8ff56efab080 | 123456789 | 
+----+-------------------------------------+------------+ 
2 rows in set (0.02 sec) 

ref_label_no表

mysql> select uuid,number_uuid,label_uuid from ref_label_no limit 1; 
+--------------------------------------+--------------------------------------+--------------------------------------+ 
| uuid         | number_uuid       | label_uuid       | 
+--------------------------------------+--------------------------------------+--------------------------------------+ 
| 7a5e1b6e-0194-4993-8d78-5f7a1b60c7d2 | ed268b05-758e-44fd-b429-8d5223651814 | 7262b06e-9263-4825-8411-4c107104a60b | 
+--------------------------------------+--------------------------------------+--------------------------------------+ 
1 row in set (0.00 sec) 

ラベルテーブル

mysql> select uuid,name from labels limit 1; 
+--------------------------------------+-------+ 
| uuid         | name | 
+--------------------------------------+-------+ 
| 7262b06e-9263-4825-8411-4c107104a60b | INDIA | 
+--------------------------------------+-------+ 
1 row in set (0.00 sec) 

は、今私は、合計通話と通話番号のようになりたい。私は、クエリの下に行われてきたが、何の成功はまた、応答にあまりにも多くの時間を割いていない

mysql> select uuid,name from labels limit 1; 
+--------------------------------------+-------+ 
| Number      | Total_calls | 
+--------------------------------------+-------+ 
| 13456789      |  2  | 
+--------------------------------------+-------+ 
1 row in set (0.00 sec) 

[この出力は私が必要としました]。

select count(*) as Total_calls,calls.number as did,labels.name,calls.created_at as callstart from calls, labels JOIN ref_label_no ON labels.uuid = ref_label_no.label_uuid JOIN numbers ON numbers.uuid = ref_label_no.number_uuid where labels.name="INDIA" group by calls.number; 

任意の提案または推奨ですか?

+0

'ref_label_no'表はどのような役割を果たしているん:

次のクエリを使用すると、条件EXISTS?そして、あなたがUUIDを使用しているのはなぜですか?また、これらのテーブルにも自動インクリメント列があるようです。 UUIDを使用する場合、自動インクリメントは必要ありません。 – e4c5

+0

ref_label_noテーブルには番号ラベルや番号テーブルuuidなどのすべてのrefrence値が含まれています。主キーに基づいていないuuidの参照値を使用しています。 –

+0

コメントはあまり明確ではありません申し訳ありません – e4c5

答えて

0

複数のテーブル結合を使用しないでください。ユニオン参加するよりも速くなります。

このよう

select uuid,did from calls union 
select uuid,number_uuid as did from ref_label_no union 
select uuid,name as did from labels 
+0

でも私の結果は間違って表示されますが、呼び出しテーブルからの結果だけが必要ですが、ラベル、ユニオンを使用する参照クエリでフィルタリングしたいですか? –

+0

どこに条件を適用しますか?私はテーブルエイリアスを使うべきですか? –

0
SELECT COUNT(calls.uuid) as total_calls, numbers.number 
FROM numbers JOIN calls ON numbers.number = calls.number 
JOIN ref_label_no ON ref_label_no.number_uuid = numbers.uuid 
JOIN labels ON labels.uuid = ref_label_no.label_uuid 
WHERE labels.name="INDIA" 
GROUP BY numbers.number; 

私たちは番号でグループ化のコールの合計数を計算しているので、それはと競合するため、クエリ結果にcalls.created_atを選択する能力を持っていません。集計関数COUNT

SELECT COUNT(calls.uuid) as total_calls, numbers.number 
FROM calls JOIN numbers ON numbers.number = calls.number 
WHERE EXISTS(SELECT 1 FROM ref_label_no JOIN labels ON labels.uuid = ref_label_no.label_uuid 
WHERE labels.name="INDIA" AND numbers.uuid = ref_label_no.number_uuid) 
GROUP BY numbers.number; 
+0

このクエリを使用して、私の通話のテーブルには約1 lkのレコードがあり、レコードを取得するのに約8分かかります。私の場合はうまくいかない。 –

+0

テーブルにはどのようなインデックスがありますか?テーブルのインデックスの欠如がパフォーマンスの主な原因です。そしてそれはあなたに正しい結果を返しましたか? – bean

+0

適用済みのインデックス作成中です。このクエリでは、「20行を設定(7.64秒)」でレコードを取得します。まだ7秒は非常に大きなカウントです。 –

関連する問題