Intereting Posts
Поиск ссылок, соответствующих заданной строке в запросе xpath / domdocument Что эквивалентно оператору сброса ветвей («? |»), Найденному в php (pcre) в C #? Поиск текущего номера страницы в WordPress php number_format (), где формирующая строка является переменной добавьте класс в определенную строку в codeigniter, используя класс таблицы Как проверить, поддерживается ли загрузка файлов на сервере с помощью php TLS 1.2 не работает в cURL Предупреждение: PDOStatement :: bindValue (): SQLSTATE : Недопустимый номер параметра: Столбцы / Параметры основаны на 1 Категории детей WordPress, не работающие в URL-адресах, как они должны Настройка нескольких языков wordpress MySQL подготовил оператор против обычного запроса. Прибыль и убытки Ширина экрана if-statement PHP Сайт сохраняет файл index.php, а не открывает его в локальном сервере WAMP Потребление памяти PDO / MySQL с большим набором результатов автоматически сохранять дату и время с помощью Yii

Выбор из нескольких таблиц, огромный результат

Я пытаюсь выбрать элементы из 2 таблиц, он должен вернуть 2 результата, но я получаю больше 1000:

$sqlH = 'SELECT * FROM sheikh_tbl, wall'; $sqlH .= ' WHERE shk_fname LIKE "%'.$keyword.'%"'; $sqlH .= ' OR shk_mname LIKE "%'.$keyword.'%"'; $sqlH .= ' OR shk_lname LIKE "%'.$keyword.'%"'; $sqlH .= ' OR (srub = "Sawtiyat" AND wtitle LIKE "%'.$keyword.'%")'; 

Спасибо, что объяснили мне вопрос с запросом

EDIT: UNION ALL используется вместо UNION

Поведение UNION по умолчанию состоит в том, что дубликаты строк удаляются из результата. Дополнительное ключевое слово DISTINCT не имеет никакого эффекта, кроме значения по умолчанию, поскольку оно также указывает удаление дубликатов строк. С необязательным ключевым словом ALL удаление дубликатов строк не происходит, и результат включает все соответствующие строки из всех операторов SELECT.

Related of "Выбор из нескольких таблиц, огромный результат"

Критнер дал ответ, я просто хотел уточнить для вашего понимания:

Список таблиц, разделенных запятыми, – это устаревший синтаксис соединения, когда критерии фильтрации не используются для фильтрации соединения, вы получаете перекрестное объединение / декартово произведение:

Таблица 1:

 ID 1 2 3 

Таблица 2:

 ID 4 5 6 

Итак, этот запрос:

 SELECT * FROM Table1,Table2 

Возвращает:

 1,4 1,5 1,6 2,4 2,5 2,6 3,4 3,5 3,6 

Поскольку ваши критерии WHERE были списком OR операторов, вы получили все записи, потому что по крайней мере один из критериев соответствовал записи из каждой таблицы. Вам нужно либо использовать надлежащее соединение, либо, как предлагает Критнер, UNION два несвязанных запроса, чтобы получить один результирующий набор.

Вам не хватает условия соединения. Без этого каждая строка из первой таблицы связана с каждой строкой из второй таблицы.

Предполагая, что обе таблицы имеют столбец id который должен соответствовать:

 $sqlH = 'SELECT * FROM sheikh_tbl, wall'; $sqlH .= ' WHERE sheikh_tbl.id = wall.id'; $sqlH .= ' AND (shk_fname LIKE "%'.$keyword.'%"'; $sqlH .= ' OR shk_mname LIKE "%'.$keyword.'%"'; $sqlH .= ' OR shk_lname LIKE "%'.$keyword.'%"'; $sqlH .= ' OR (srub = "Sawtiyat" AND wtitle LIKE "%'.$keyword.'%"))'; 

Или еще лучше, вы должны использовать более современный явный синтаксис join :

 $sqlH = 'SELECT * FROM sheikh_tbl'; $sqlH .= ' JOIN wall ON sheikh_tbl.id = wall.id'; $sqlH .= ' WHERE shk_fname LIKE "%'.$keyword.'%"'; $sqlH .= ' OR shk_mname LIKE "%'.$keyword.'%"'; $sqlH .= ' OR shk_lname LIKE "%'.$keyword.'%"'; $sqlH .= ' OR (srub = "Sawtiyat" AND wtitle LIKE "%'.$keyword.'%")'; 

Ваш вопрос довольно запутанный … но на основе комментариев что-то вроде этого может сделать ya:

 $sqlH = 'SELECT * FROM sheikh_tbl'; $sqlH .= ' WHERE shk_fname LIKE "%'.$keyword.'%"'; $sqlH .= ' OR shk_mname LIKE "%'.$keyword.'%"'; $sqlH .= ' OR shk_lname LIKE "%'.$keyword.'%"'; $sqlH .= ' OR (srub = "Sawtiyat" AND wtitle LIKE "%'.$keyword.'%")'; $sqlH .= 'UNION SELECT * FROM wall'; $sqlH .= ' WHERE shk_fname LIKE "%'.$keyword.'%"'; $sqlH .= ' OR shk_mname LIKE "%'.$keyword.'%"'; $sqlH .= ' OR shk_lname LIKE "%'.$keyword.'%"'; $sqlH .= ' OR (srub = "Sawtiyat" AND wtitle LIKE "%'.$keyword.'%")'; 

это предполагает, что ваша схема одинакова между двумя таблицами, ваш «,» подразумевает, что соединение, о котором вы заявили, не должно происходить. Вышеприведенный запрос тот же, просто выделенный союзом. Можете помочь, но опубликовать свою схему и почему вы ожидаете, что 2 результата будут более полезными.

Я использовал СОЮЗ, как было предложено выше:

 $sqlH = 'SELECT shk_fname FROM sheikh_tbl'; $sqlH .= ' WHERE shk_fname LIKE "%'.$keyword.'%"'; $sqlH .= ' OR shk_mname LIKE "%'.$keyword.'%"'; $sqlH .= ' OR shk_lname LIKE "%'.$keyword.'%"'; $sqlH .= ' UNION SELECT srub FROM wall'; $sqlH .= ' WHERE rub = "Sawtiyat" AND wtitle LIKE "%'.$keyword.'%"'; 

Таким образом, это 2 запроса, результат – 2 (что неверно, я добавил новую вставку), и если я их разделяю, я получил результат 3 (это верно)