我正在处理车辆搜索资源。根据我们当前的查询,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%')
截至目前,查询结果返回零行。如果我只使用两个meta_key & meta_value
查询过滤器中的一个,则会返回记录vehicle_id: 1
。
我只想尝试返回与所有meta
个查询过滤器匹配的车辆ID。
答案 0 :(得分:0)
只有其中一个启用时才有效,因为它将它应用于每一行。因此关键不是每行的类型和模型,对于perf和cuddy位都是相同的。
你想做的事情不是OR,因为你确实需要选择其中两者都属实的vehicle_id。
关闭袖口我要做的就是首先执行select *,然后用vehicle_metas执行内部连接,然后从第二个要求中选择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%')
答案 1 :(得分: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)