繁体   English   中英

Mysql JOIN与LIKE语句

[英]Mysql JOIN with LIKE statement

我有两张桌子,一张是城市,一张是pois。 我想从查询字符串中查找城市或城市。 查询字符串可以是ABC咖啡店或旧金山。 执行以下查询,但返回空集建议?

SELECT cities.city, cities.state, pois.name FROM cities, pois 
WHERE cities.city OR pois.name LIKE '$queryString%';

表:城市

+---------+-------+---------------+
| city_id | state | city          |
+---------+-------+---------------+
|       4 | CA    | San Francisco |
+---------+-------+---------------+

表:pois

+--------+---------+-------------------------------+
| loc_id | city_id | name                          |
+--------+---------+-------------------------------+
|      2 |       4 | San Francisco Coffee Roasters |
+--------+---------+-------------------------------+

更新:基于@Johan的答案,我创建了以下查询,该查询返回以下结果。 返回的结果是正确的,但我还想返回一个单独的行,例如example A,结果类似于example A查询。 我认为工会是我所需要的吗?

 SELECT p.name, c.city, c.state
FROM cities c
INNER JOIN pois p ON ( p.city_id = c.city_id )
WHERE p.name LIKE '%San Francisco%'


+-------------------------------+---------------+-------+
| name                          | city          | state |
+-------------------------------+---------------+-------+
| San Francisco Coffee Roasters | San Francisco | CA    |
+-------------------------------+---------------+-------+

示例查询:!!! 该查询返回错误#1222-使用的SELECT语句具有不同的列数

SELECT p.name, c.city, c.state
FROM cities c
INNER JOIN pois p ON ( p.city_id = c.city_id )
WHERE p.name LIKE '%San Francisco%'
UNION SELECT c.city, c.state
FROM cities c
WHERE c.city LIKE '%San Francisco%'

示例结果:

+-------------------------------+---------------+-------+
| name                          | city          | state |
+-------------------------------+---------------+-------+
| San Francisco Coffee Roasters | San Francisco | CA    |
+-------------------------------+---------------+-------+
+---------------+-------+
| city          | state |
+---------------+-------+
| San Francisco | CA    |
+---------------+-------+

事先有几点评论:

•不要使用SQL '89样式的隐式联接语法,这是一种反模式。
•改用显式SQL '92连接语法,请参见下面的第一个示例。
•如果$querystring来自用户,则需要对其进行转义,请参见第一个示例。

这是示例代码:

$querystring = mysql_real_escape_string($querystring);
$query = "SELECT c.name, p.name FROM cities c 
          INNER JOIN pios p ON (p.city_id = c.id)
          WHERE c.name LIKE '%$querystring%' 
             OR p.name LIKE '%$querystring%' ";

也许您想要一个UNION

$query = "SELECT c.name FROM cities c 
          WHERE c.name LIKE '%$querystring%'
        UNION
          SELECT p.name FROM pios p 
          WHERE p.name LIKE '%$querystring%' ";

按要求编辑
如果使用联合,则所有涉及的选择必须产生相同数量的列。
如果没有数据,则用null代替。

SELECT p.name, c.city, c.state
FROM cities c
INNER JOIN pois p ON ( p.city_id = c.city_id )
WHERE p.name LIKE '%San Francisco%'
UNION 
SELECT NULL as name, c.city, c.state
FROM cities c
WHERE c.city LIKE '%San Francisco%'

要通过联接执行此操作:

SELECT C.city, C.state, P.name 
FROM cities C
LEFT JOIN pois P ON P.city_id=C.id
WHERE C.city LIKE '$queryString%'
  OR P.name LIKE '$queryString%'
SELECT DISTINCT p.name, c.city, c.state
FROM cities c
LEFT OUTER JOIN pois p ON p.city_id = c.city_id 
WHERE cities.city LIKE '%$queryString%' 
OR pois.name LIKE '%$queryString%';

或者,

SELECT p.name, c.city, c.state
FROM cities c
INNER JOIN pois p ON p.city_id = c.city_id
WHERE p.name LIKE '%$queryString%'
UNION SELECT NULL, c.city, c.state
FROM cities c
WHERE c.city LIKE '%$queryString%'
SELECT cities.city, cities.state, pois.name FROM cities, pois 
WHERE cities.city LIKE '$queryString%' OR pois.name LIKE '$queryString%';

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2025 STACKOOM.COM