尝试更正MySQL查询以返回带有连接表的所需结果

时间:2016-03-22 16:50:55

标签: 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%')

截至目前,查询结果返回零行。如果我只使用两个meta_key & meta_value查询过滤器中的一个,则会返回记录vehicle_id: 1

我只想尝试返回与所有meta个查询过滤器匹配的车辆ID。

2 个答案:

答案 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)