2016-03-22 10 views
1

私は車両検索リソースに取り組んでいます。現在のクエリに基づいて、MySQLは正しい結果を返しています。しかし、結果は私が探しているものではありません。クエリに間違いがありますが、それを修正する方法がわかりません。希望の結果を返すためにMySQLクエリを修正しようとしました。

車テーブル

+----+--------+--------------+---------------------+---------------------+ 
| id | active | label  |  created_at  |  updated_at  | 
+----+--------+--------------+---------------------+---------------------+ 
| 1 |  1 | test vehicle | 2016-03-14 15:34:00 | 2016-03-14 15:34:00 | 
+----+--------+--------------+---------------------+---------------------+ 

vehicles_metasテーブル

+----+--------+------------+------------+------------------+---------------------+---------------------+ 
| id | active | vehicle_id | meta_key | meta_value |  created_at  |  updated_at  | 
+----+--------+------------+------------+------------------+---------------------+---------------------+ 
| 1 |  1 |   1 | type  | Performance Boat | 2016-03-14 15:36:00 | 2016-03-14 15:36:00 | 
| 2 |  1 |   1 | make  | Deep Impact  | 2016-03-14 15:36:00 | 2016-03-14 15:36:00 | 
| 3 |  1 |   1 | model  | Cuddy Cabin  | 2016-03-14 15:36:00 | 2016-03-14 15:36:00 | 
| 4 |  1 |   1 | year  | 2014    | 2016-03-14 15:36:00 | 2016-03-14 15:36:00 | 
| 5 |  1 |   1 | length  | 39    | 2016-03-14 15:36:00 | 2016-03-14 15:36:00 | 
| 6 |  1 |   1 | propulsion | (4) Mercury 350 | 2016-03-14 15:36:00 | 2016-03-14 15:36:00 | 
| 7 |  1 |   1 | hull  | fiberglass  | 2016-03-14 15:36:00 | 2016-03-14 15:36:00 | 
| 8 |  1 |   1 | price  | 399000   | 2016-03-14 15:36:00 | 2016-03-14 15:36:00 | 
+----+--------+------------+------------+------------------+---------------------+---------------------+ 

現在のmysqlのクエリが

:ここでは

はテーブルです今のよう

select `vehicles`.`id` from `vehicles` inner join `vehicle_metas` on `vehicle_metas`.`vehicle_id` = `vehicles`.`id` where (`vehicle_metas`.`meta_key` = 'type' and `vehicle_metas`.`meta_value` LIKE '%perf%') and (`vehicle_metas`.`meta_key` = 'model' and `vehicle_metas`.`meta_value` LIKE '%cuddy%') 

、ゼロ行のクエリ結果が返されます。 2つのmeta_key & meta_valueクエリフィルタのうち1つだけを使用すると、レコードvehicle_id: 1が返されます。

私は単純にすべてのmetaクエリーフィルタと一致する車両IDを返すようにしようとしています。

+0

注:私たちは、このプロジェクトにLaravel 5.2を使用しています。 – user2977468

答えて

0

あなたの現在のクエリから戻ってすべての結果を取得されていませんなぜ@robestrongは説明しました。

彼が参加して解決策を提案し、私はexists subqueryを使用して、別の解決策を提案してみましょう:

select `vehicles`.`id` 
from `vehicles` 
inner join `vehicle_metas` vm1 on vm1.`vehicle_id` = `vehicles`.`id` 
where vm1.`meta_key` = 'type' and vm1.`meta_value` LIKE '%perf%' and EXISTS (select 1 FROM `vehicle_metas` vm2 WHERE vm2.`meta_key` = 'model' and vm2.`meta_value` LIKE '%cuddy%' and vm2.vehicle_id=vm1.vehicle_id) 
+0

「EXISTS」評価に私を紹介してくれてありがとう。この解決策はうまくいきました。私たちは 'EXISTS'エバリュエータをネイティブに提供するLaravelを使用しています。 – user2977468

0

片方のみが有効になっている場合、それは各行に適用ですので、それは動作します。したがって、キーは各行にタイプとモデルの両方ではなく、perfとcuddyビットについても同じです。あなたはそれらの両方に該当するvehicle_idを選択する必要がないので、あなたが何をしたいのか

は、しかし、されていませんか。私がやるだろう何カフオフ

は、内側がvehicle_metasでそのことを参加した後、第2の要件とそれからvehicles.id選択し実行した後、一つだけ彼らの最初に*を選択し実行しています。あなたの両方の基準を満たしているvehicles.idのサブセットを与える必要があります

(未テスト)このような何か:

select vehicles.id from 

(select * 

from vehicles inner join vehicle_metas 

on vehicle_metas.vehicle_id = vehicles.id 

where (vehicle_metas.meta_key = 'type' and vehicle_metas.meta_value LIKE '%perf%')) 

as subset inner join vehicle_metas 

on subset.vehicle_id = vehicle_metas.vehicle_id 

where 

(vehicle_metas.meta_key = 'model' and vehicle_metas.meta_value LIKE '%cuddy%') 
+0

OK、それは意味があります。粗い、またはテストされていないサンプルを提供できますか?どうもありがとうございました。 – user2977468

+0

OPの現在のクエリがレコードを返さない理由を説明しました。しかし、私は提案された解決策の部分を強化していくつもりです。いくつかのコード例はどちらも傷つけません。 – Shadow

+0

@ Shadowそれを更新します。だからこそ、SOは新しいので、ここでの作業の仕方を感じ取ることができます。 – robestrong

関連する問題