Запрос с JOIN в три таблицы: помогите составить!

Тема в разделе "Базы данных", создана пользователем Albert22, 9 июл 2009.

Статус темы:
Закрыта.
Модераторы: latteo
  1. Albert22

    Albert22

    Регистр.:
    30 мар 2008
    Сообщения:
    270
    Симпатии:
    10
    Привет
    Замучался составлять запрос.
    Есть три интересующих поля: events.city, places.city, users.location соответственно из таблиц events, places и users.
    Нужно выбрать все города, название которых начинается на заданные буквы. Это для автозаполнения.
    Нашёл хорошую статью: Перейти по ссылке
    По примеру попытался составить следующий запрос, для начала затрагивающий две таблицы (три я не осилил:(
    Код:
    $query = mysql_query("SELECT DISTINCT `places`.`city`,`events`.`city` FROM `places` FULL OUTER JOIN `events` ON `places`.`city`=`events`.`city` WHERE `places`.`city` LIKE '".$value."%' OR `events`.`city` LIKE '".$value."%' LIMIT 10");
    
    Выдаёт ошибку
    Пробовал разные комбинации — скорее всего что-то делаю неправильно.
    Укажите, пожалуйста, что именно?
     
  2. AndreyD2

    AndreyD2

    Регистр.:
    21 окт 2008
    Сообщения:
    194
    Симпатии:
    67
    По ссылке самый бональный пример джоинов - можно найти и на русском языке описание и более расширенное

    По поводу твоего вопроса:
    сформулируй что тебе нужно, так как то что ты написал для автозаполнения нафик не нужно)))
     
  3. Albert22

    Albert22

    Регистр.:
    30 мар 2008
    Сообщения:
    270
    Симпатии:
    10
    Формулирую: имеются три таблицы, в каждой есть свой столбец, где указан город (проживания юзера, проведения мероприятия и т.д.). На базе имеющихся городов нужно сделать автозаполнение.

    Например:
    - в таблице users есть строка где location=Керчь
    - в таблице events есть несколько строк где city=Киев
    - в таблице places есть строка где city=Кировоград
    Необходимо:
    чтобы скрипт, получив введенную посетителем букву «к» посредством регистронезависимого поиска вернул массив
    Код:
    Array([0]=>'Керчь', [1]=>'Киев', [2]=>'Кировоград')
     
  4. ConstNW

    ConstNW Постоялец

    Регистр.:
    30 июн 2007
    Сообщения:
    132
    Симпатии:
    39
    вообще-то стоило начать с изучения "нормализации данных".
    но если требуется быстрое решение и прямо сейчас, то:
    Код:
    SELECT `city` FROM places WHERE `city` LIKE '".$value."%'
    UNION
    SELECT `city` FROM events WHERE `city` LIKE '".$value."%'
    UNION
    SELECT `location` FROM users WHERE `location` LIKE '".$value."%'
    
    DISTINCT не потребуется, т.к. при UNION он автоматически применяется.
     
    Albert22 нравится это.
  5. AndreyD2

    AndreyD2

    Регистр.:
    21 окт 2008
    Сообщения:
    194
    Симпатии:
    67
    Код:
    select Field,'',''  from Tab1 where Field like ...
    union
    select '',Field ,'' from  Tab2 where Field like ...
    union
    select '','',Field from Tab3 where Field like ...
    
     
    Albert22 нравится это.
  6. Albert22

    Albert22

    Регистр.:
    30 мар 2008
    Сообщения:
    270
    Симпатии:
    10
    Спасибо, про нормализацию погуглю, оперативное решение работает.
    Насколько я понимаю, его быстродействие уступает JOINу?
     
  7. ConstNW

    ConstNW Постоялец

    Регистр.:
    30 июн 2007
    Сообщения:
    132
    Симпатии:
    39
    Нет, не уступает и даже наоборот.
    При достаточно большом кол-ве пользователей тот запрос с JOIN'ом будет вешать сервак напрочь.
     
  8. AndreyD2

    AndreyD2

    Регистр.:
    21 окт 2008
    Сообщения:
    194
    Симпатии:
    67
    Join актуален при использовании реляционной БД, в твоем случае лучше union.
     
  9. Albert22

    Albert22

    Регистр.:
    30 мар 2008
    Сообщения:
    270
    Симпатии:
    10
    Спасибо за помощь.
     
Статус темы:
Закрыта.