Mysql ПРИСОЕДИНЯЙТЕСЬ с НРАВИТСЯ заявлением - PullRequest
0 голосов
/ 06 сентября 2011

У меня есть две таблицы, одна с городами и одна с пуазом. Я хочу найти города или объекты в строке запроса. Строка запроса может быть 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 |
+--------+---------+-------------------------------+

Обновление: на основе ответа @ Йохана я создал следующий запрос, который возвращает результаты ниже. Возвращенные результаты верны, но я хотел бы также вернуть отдельную строку, например, в примере A, используя нечто похожее на пример запроса 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%'

Пример A результата:

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

Ответы [ 4 ]

3 голосов
/ 07 сентября 2011

Несколько комментариев заранее:

• Не используйте синтаксис неявного соединения в стиле 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%' ";

Или, может быть, вы хотите СОЮЗ

$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%'
2 голосов
/ 06 сентября 2011

Для этого нужно выполнить соединение:

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%'
1 голос
/ 06 сентября 2011
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%'
0 голосов
/ 06 сентября 2011
SELECT cities.city, cities.state, pois.name FROM cities, pois 
WHERE cities.city LIKE '$queryString%' OR pois.name LIKE '$queryString%';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...