Есть две таблицы новостей и статей. Нужно одним запросом найти совпадения как из новостей так и из статей. делаю так $SQL = "SELECT * FROM `tab1`,`tab2` WHERE `tab1`.`news` LIKE '%$poisk%' OR `tab2`.`article` LIKE '%$poisk%' LIMIT $start, $num"; но в ответ просто удваивает результат. То есть скажем находится слово "море" и в результатах оно по два раза выводится. Что я делаю не так?
1. Задавая вопрос касающийся некорректной выборке из баз данных принято приводть структуры таблиц и дампы отладочных данных. 2. Ваш поиск не эффективен и не соответствует прямому назначению реляционных баз данных, что заметно отразится на длительном выполнении этого запроса с ростом записей в таблицах поиска. Для вашей задачи оптимальнее использовать движки полнотекствого поиска, как то Sphinx, Zend_Search_Lucene. 3. Вы не представили ни скрипты, обрабатывающие результат выборки, ни сам результат, поэтому ответить на ваш вопрос затруднительно.
а как ты выполняешь этот запрос? в расширении mysql есть mysql_real_escape_string, в других — другие средства. Добавлено спустя 35 секунд: гуглить "sql injection"
Ладно с экранированием я как то разберусь. А как получить одним запросом данные из двух таблиц? Что не так в моем примере?
Если по-человечески, то никак. Когда ты указываешь список таблиц через запятую, то это равнозначно записи 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): SELECT * FROM `table1`, `table2`; Но обычно такие данные никому не нужны. Из нескольких таблиц выборку делают с учетом их связей. Если бы у одной из этих таблиц был внешний ключ, то запрос можно было бы сделать так: Код (PHP): SELECT * FROM `table1`, `table2` ON `table2`.`table1_id` = `table1`.`id`; И тогда все лишнее убирается. Вообщем, что я тебе хотел этим сказать... Так как хочешь ты - так не делают. Объединение таблиц - это операция, предназначенная для получения данных "связанных" записей таблиц. Все остальное - это уже костыли и т. д. Короче, вот почитай... http://ru.wikipedia.org/wiki/Join_(SQL)
select id, news as txt from tab1 where news like '%$poisk%' union all select id, articles as txt from tab2 where articles like '%$poisk%';