Я пытаюсь выбрать элементы из 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.
Критнер дал ответ, я просто хотел уточнить для вашего понимания:
Список таблиц, разделенных запятыми, – это устаревший синтаксис соединения, когда критерии фильтрации не используются для фильтрации соединения, вы получаете перекрестное объединение / декартово произведение:
Таблица 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 (это верно)