按顺序匹配数据
Posted
技术标签:
【中文标题】按顺序匹配数据【英文标题】:Match data in order 【发布时间】:2015-08-13 08:59:29 【问题描述】:我正在尝试根据用户搜索从多个表中获取数据。 但它不符合我的要求。
我要从中获取记录的表:
-
街道
城市
状态
假设用户输入'a',然后我想先从街道表中搜索,然后我想在城市表中查找,最后我想在州表中查找。
试过了:
我正在使用这个查询来获取记录:
SELECT streetObj.street_id AS street_id, CONCAT( streetObj.name, ' , ', cityObj.name, ' , ', stateObj.name ) namet
FROM street streetObj
LEFT JOIN city cityObj ON streetObj.city_id = cityObj.city_id
LEFT JOIN state stateObj ON stateObj.state_id = cityObj.state_id
WHERE (
streetObj.name LIKE 'a%'
OR cityObj.name LIKE 'a%'
OR stateObj.name LIKE 'a%'
)
LIMIT 10
但是这个查询首先从州表中搜索,然后从城市表中搜索,最后从街道表中搜索。
如何更改顺序以查看表格?
解释:
街道:
Ram darbar
chawala street
palam street
城市:
Kota
Ahemdabad
Jaipur
州:
Rajasthan
Chennai
Gujrat
所以我想在用户输入“R”或“r”时看到这样:
Ram darbar,Jaipur,Rajasthan
但是我的查询给了我这样的结果:
palam street,Jaipur,Rajasthan
这也没有意义。
【问题讨论】:
将 cityObj.name 和 stateObj.name 从 WHERE 子句移动到 ON 子句以获得真正的 LEFT JOIN 行为。 (就像现在一样,它作为常规内部连接执行......) 这将如何改变结果?我认为您的问题并不能说明您到底想要什么? 因为按照我的要求,Street在city,而city在state,所以我需要按照这种格式显示数据;街道名称,城市名称,州名, 请稍等,我正在举这个问题的例子,这将清除我的要求。 你怎么知道它首先是在州搜索,然后是城市,然后是街道......即使查询会在你使用或条件的所有表中搜索。 【参考方案1】:您可能希望将条件从 WHERE
移动到 JOIN ON
子句,如
SELECT streetObj.street_id AS street_id,
CONCAT(streetObj.name, ' , ', cityObj.name, ' , ', stateObj.name ) namet
FROM street streetObj
LEFT JOIN city cityObj ON streetObj.city_id = cityObj.city_id
LEFT JOIN state stateObj ON stateObj.state_id = cityObj.state_id
WHERE streetObj.name LIKE 'a%';
根据您最近在帖子中的编辑,您实际上并不需要以下条件,而应该只在 street
表中搜索。由于JOIN
,您应该通过匹配记录来获取数据
OR cityObj.name LIKE 'a%'
OR stateObj.name LIKE 'a%'
【讨论】:
通过此查询,如果街道表中不存在记录,则即使在其他城市和州表中也不会搜索...... 对不起,但它不起作用。显示这样的数据 149528 NULL 198701 NULL 304788 NULL @ZafarMalik,那就对了。如果将此条件放在WHERE
中,则效果与INNER JOIN
相同,而不是LEFT JOIN
【参考方案2】:
SQL Fiddle
数据库架构
create table streettbl
(street_id varchar(20),
name varchar(30),
city_id varchar(20));
create table citytbl
(city_id varchar(20),
name varchar(30),
state_id varchar(30));
create table statetbl
(state_id varchar(20),
name varchar(30));
insert into streettbl values('street2','palam street','city1');
insert into streettbl values('street1','ram darbar','city1');
insert into citytbl values('city1','jaipur','state1');
insert into statetbl values('state1','rajasthan');
回答选择查询
SELECT streetObj.street_id AS street_id,
CONCAT( streetObj.name, ' , ', cityObj.name, ' , ', stateObj.name ) namet,
case when streetObj.name like 'r%' then 1
when cityObj.name like 'r%' then 2
when stateObj.name like 'r%' then 3
else 0 end orderby
FROM streettbl streetObj
LEFT JOIN citytbl cityObj ON (streetObj.city_id = cityObj.city_id)
LEFT JOIN statetbl stateObj ON (stateObj.state_id = cityObj.state_id)
WHERE (
streetObj.name LIKE 'r%'
OR cityObj.name LIKE 'r%'
OR stateObj.name LIKE 'r%'
)
order by orderby
输出
| street_id | namet | orderby |
|-----------|--------------------------------------|---------|
| street1 | ram darbar , jaipur , rajasthan | 1 |
| street2 | palam street , jaipur , rajasthan | 3 |
【讨论】:
【参考方案3】:你可以试试-
SELECT * FROM street AS stt
LEFT JOIN city AS ct ON stt.city_id=ct.id
LEFT JOIN state AS st ON ct.state_id=st.id
WHERE
IF(
(SELECT COUNT(*) FROM street WHERE NAME LIKE 'a%')>0,stt.name LIKE 'a%',
IF(
(SELECT COUNT(*) FROM city WHERE NAME LIKE 'a%')>0, ct.name LIKE 'a%',
st.name LIKE 'a%'
)
) LIMIT 10;
【讨论】:
以上是关于按顺序匹配数据的主要内容,如果未能解决你的问题,请参考以下文章