2017-09-13 12 views
0

私は単純なクエリのように思っています。私はselect句にサブクエリを追加しようとするまでうまく動作するクエリを持っています。私は最初から取得した日付で2番目のテーブルを照会して列を追加しようとしています。私は結合がよりよいかもしれないかどうかわからない。最初のサンプルを見ると、外側のselectステートメントからの日付範囲を使用する代わりに、2番目のテーブルのすべてのレコードが返されます。私はちょうどこのように日付などの文字列を入力するとメインクエリ値との日時比較を伴うMySQLサブクエリ

SELECT `sales`.`date` as 'newdate', `sales`.`material`, 
`customer_logs`.`name`, `sales`.`billingqty` , 
(select count(*) from iis_logs where datetime > (select 
Date_add(date_format(newdate, "%Y-%m-%d 00:00:00"), interval - 1 day)) 
and datetime < date_format(newdate, '%Y-%m-%d 00:00:00' and url like 
CONCAT('%',material,'%') limit 1) as tr 
FROM `sales` 
JOIN `customer_logs` ON `customer_logs`.`customer_number` = 
`sales`.`soldtopt` 
WHERE `date` >= '2017-09-01' 
AND `date` <= '2017-09-30' 
ORDER BY `date` DESC 
LIMIT 10; 

それは秒以内に返されます。

SELECT `sales`.`date` as 'newdate', `sales`.`material`, 
`customer_logs`.`name`, `sales`.`billingqty` , 
(select count(*) from iis_logs where datetime > '2017-09-01 00:00:00' 
and datetime < '2017-09-03 00:00:00' and url like 
CONCAT('%',material,'%') limit 1) as tr 
FROM `sales` 
JOIN `customer_logs` ON `customer_logs`.`customer_number` = 
`sales`.`soldtopt` 
WHERE `date` >= '2017-09-01' 
AND `date` <= '2017-09-30' 
ORDER BY `date` DESC 
LIMIT 10; 

はそれではなく、私はselect文で取得しようとしていますNEWDATEの値を取っていませんiis_logsテーブルのすべての行を戻しています...

答えて

0

これは、結合のための完璧な候補のようです。 FWIWでは、mysqlクエリオプティマイザは、通常、サブクエリの結合に優れています。

+0

リテラル日付の代わりに選択から結果を使用するたびに結合を試みましたが、それはもはや機能しません。比較の日付としてselectの結果を使用すると何か問題が起きていますか? –

+0

結合で使用したコードを投稿できますか? – pucky124

+0

date_format( 's'.'date'、 '%Y-%m-%d- 00:00:59')を '終了'として選択すると、 date_format(' s'.'date'、 '%Y-%m - %d 00:00:00 ')を'開始 '、' s'、 '材料'、 's'.'billingqty'、iis_logs.datetime から販売しています。 はiis_logsに参加しました。iis_logsiis_logs.datetime on date_format date_format( 's'.'date'、 '%Y-%m-%d 23:59:%d-%m-%d 00:00:00' 59 ') WHAT 'date'> =' 2017-06-05 ' AND' date' <=' 2017-06-30 ' LIMIT 5; –