【问题标题】:Match data in order按顺序匹配数据
【发布时间】:2015-08-13 08:59:29
【问题描述】:

我正在尝试根据用户搜索从多个表中获取数据。 但它不符合我的要求。

我要从中获取记录的表:

  1. 街道
  2. 城市
  3. 状态

假设用户输入'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,所以我需要按照这种格式显示数据;街道名称,城市名称,州名,
  • 请稍等,我正在举这个问题的例子,这将清除我的要求。
  • 你怎么知道它首先是在州搜索,然后是城市,然后是街道......即使查询会在你使用或条件的所有表中搜索。

标签: mysql sql sql-order-by


【解决方案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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-02
      • 1970-01-01
      相关资源
      最近更新 更多