За последние 24 часа нас посетили 18785 программистов и 1702 робота. Сейчас ищет 861 программист ...

Два SELECT из разных таблиц

Тема в разделе "PHP и базы данных", создана пользователем sumsum, 10 июн 2014.

  1. sumsum

    sumsum Новичок

    С нами с:
    13 май 2014
    Сообщения:
    96
    Симпатии:
    0
    Есть две таблицы новостей и статей. Нужно одним запросом найти совпадения как из новостей так и из статей. делаю так
    $SQL = "SELECT * FROM `tab1`,`tab2` WHERE `tab1`.`news` LIKE '%$poisk%' OR `tab2`.`article` LIKE '%$poisk%' LIMIT $start, $num";
    но в ответ просто удваивает результат. То есть скажем находится слово "море" и в результатах оно по два раза выводится. Что я делаю не так?
     
  2. dapperkop

    dapperkop Активный пользователь

    С нами с:
    26 сен 2013
    Сообщения:
    890
    Симпатии:
    0
    Сделай два запроса

    Добавлено спустя 1 минуту 3 секунды:
    )) Экранируй хотя бы))
     
  3. Zuldek

    Zuldek Старожил

    С нами с:
    13 май 2014
    Сообщения:
    2.381
    Симпатии:
    344
    Адрес:
    Лондон, Тисовая улица, дом 4, чулан под лестницей
    1. Задавая вопрос касающийся некорректной выборке из баз данных принято приводть структуры таблиц и дампы отладочных данных.
    2. Ваш поиск не эффективен и не соответствует прямому назначению реляционных баз данных, что заметно отразится на длительном выполнении этого запроса с ростом записей в таблицах поиска. Для вашей задачи оптимальнее использовать движки полнотекствого поиска, как то Sphinx, Zend_Search_Lucene.
    3.
    Вы не представили ни скрипты, обрабатывающие результат выборки, ни сам результат, поэтому ответить на ваш вопрос затруднительно.
     
  4. sumsum

    sumsum Новичок

    С нами с:
    13 май 2014
    Сообщения:
    96
    Симпатии:
    0
    Могу ошибаться, но тогда нарушится пейджинатор
    Как именно экранировать?
     
  5. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.251
    Адрес:
    там-сям
    а как ты выполняешь этот запрос? в расширении mysql есть mysql_real_escape_string, в других — другие средства.

    Добавлено спустя 35 секунд:
    гуглить "sql injection"
     
  6. sumsum

    sumsum Новичок

    С нами с:
    13 май 2014
    Сообщения:
    96
    Симпатии:
    0
    Ладно с экранированием я как то разберусь. А как получить одним запросом данные из двух таблиц? Что не так в моем примере?
     
  7. dapperkop

    dapperkop Активный пользователь

    С нами с:
    26 сен 2013
    Сообщения:
    890
    Симпатии:
    0
    Если по-человечески, то никак. Когда ты указываешь список таблиц через запятую, то это равнозначно записи JOIN, что соответствует декартову произведению всех строк из двух таблиц, т. е.

    есть таблица `table1`:
    id | value
    1 | 1
    2 | 2
    3 | 3

    и таблица `table2`:
    id | value
    1 | 1
    2 | 2
    3 | 3

    то их произведение - это:
    `table1`.`id` | `table1`.`value` | `table2`.`id` | `table2`.`value`
    1 | 1 | 1 | 1
    1 | 1 | 2 | 2
    1 | 1 | 3 | 3
    2 | 2 | 1 | 1
    2 | 2 | 2 | 2
    2 | 2 | 3 | 3
    3 | 3 | 1 | 1
    3 | 3 | 2 | 2
    3 | 3 | 3 | 3

    Это если мы просто напишем такой запрос:
    Код (PHP):
    1. SELECT * FROM `table1`, `table2`;
    2.  
    Но обычно такие данные никому не нужны. Из нескольких таблиц выборку делают с учетом их связей.

    Если бы у одной из этих таблиц был внешний ключ, то запрос можно было бы сделать так:
    Код (PHP):
    1. SELECT * FROM `table1`, `table2` ON `table2`.`table1_id` = `table1`.`id`;
    2.  
    И тогда все лишнее убирается.

    Вообщем, что я тебе хотел этим сказать... Так как хочешь ты - так не делают. Объединение таблиц - это операция, предназначенная для получения данных "связанных" записей таблиц. Все остальное - это уже костыли и т. д.

    Короче, вот почитай...
    http://ru.wikipedia.org/wiki/Join_(SQL)
     
  8. Хыиуду

    Хыиуду Активный пользователь

    С нами с:
    3 июн 2014
    Сообщения:
    618
    Симпатии:
    5
    select id, news as txt from tab1 where news like '%$poisk%'
    union all
    select id, articles as txt from tab2 where articles like '%$poisk%';