按顺序匹配数据

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;

【讨论】:

以上是关于按顺序匹配数据的主要内容,如果未能解决你的问题,请参考以下文章

按字典顺序选择团队配对及其相对表现之间的匹配

请问solr如何按匹配度和更新时间排序,设置权重

java正则表达式能不能不按顺序匹配?

SQL Server:按正确列的顺序匹配两个表和结果

按最大条件匹配排序

无论如何,为了提高 SQL 查询的性能,以按标签匹配计数查找具有顺序的行