Как сделать поиск по разным таблицам с разными полями?

Ссылка скопирована
1 ответ

делаю поиск по сайту, который ищет по 4м таблицам, новости, пользователи, посты, резюме. соответственно в каждой таблице свои поля. подскажите как составить запрос по этим четырем таблицам с разными полями.
у меня мозгов хватает только на использование left join через union не получается потому что при поиске по четырем таблицам sql выдает ошибку что в ответе разное количество полей. как сделать запрос?

Дополнительно:

Не маяться дурью, а сделать 4 разных запроса

Через UNION.
При выборке SELECT используйте не символ *, а конкретные поля (например, id, name и т.п.), которые переименовывайте через алиас.

SELECT `id` AS 'field1', `name` AS `field2`, `other` AS `field3` FROM `table1` UNION SELECT `uid` AS 'field1', `title` AS `field2`, `again_other` AS `field3` FROM `table2` UNION ...

SELECT `id` AS 'field1', `name` AS `field2`, `other` AS `field3` FROM `table1` UNION SELECT `uid` AS 'field1', `title` AS `field2`, `again_other` AS `field3` FROM `table2` UNION ...

в результате получите таблицу с одинаковым количеством столбцов, которую потом юзайте.
Если поле в таблице отсутствует, то для выравнивания попробуйте использовать комбинацию типа "" AS `fieldN` или NULL AS `fieldN`.

  • SELECT u.id, u.onlineSatus, ud.user_img, ud.name, ud.lastname, ud.about FROM tori_users as u, tori_user_date as ud WHERE MATCH(u.login, u.email, ud.name, ud.lastname, ud.mobile, ud.about, ud.company_name, ud.patent) AGAINST ('alex' IN BOOLEAN MODE) and u.validStatus = 1 and u.id = ud.user_id UNION SELECT p.id, p.portfolio_img, p.name, p.lastname, p.about, u.onlineSatus from tori_portfolio as p, tori_users as u  where MATCH(p.name, p.lastname, p.about) AGAINST ('alex' IN BOOLEAN MODE) and search_status = 0 and u.validStatus = 1 and u.id = p.id_user UNION SELECT a.id, a.seo, a.title, a.description FROM tori_adverts as a WHERE MATCH(a.title, a.description, a.keywords) AGAINST ('alex' IN BOOLEAN MODE) and validate = 1

    SELECT u.id, u.onlineSatus, ud.user_img, ud.name, ud.lastname, ud.about FROM tori_users as u, tori_user_date as ud WHERE MATCH(u.login, u.email, ud.name, ud.lastname, ud.mobile, ud.about, ud.company_name, ud.patent) AGAINST ('alex' IN BOOLEAN MODE) and u.validStatus = 1 and u.id = ud.user_id UNION SELECT p.id, p.portfolio_img, p.name, p.lastname, p.about, u.onlineSatus from tori_portfolio as p, tori_users as u where MATCH(p.name, p.lastname, p.about) AGAINST ('alex' IN BOOLEAN MODE) and search_status = 0 and u.validStatus = 1 and u.id = p.id_user UNION SELECT a.id, a.seo, a.title, a.description FROM tori_adverts as a WHERE MATCH(a.title, a.description, a.keywords) AGAINST ('alex' IN BOOLEAN MODE) and validate = 1

    при таком запросе выдается ошибка 1222 - Использованные операторы выборки (SELECT) дают разное количество столбцов как правильно в запрос добавить NULL AS `fieldN`

  • Вот так для каждого поля из селекта
    SELECT u.id AS `ID`, u.onlineSatus AS `STATUS`, ud.user_img AS `IMG`, ... FROM tori_users as u, tori_user_date as ud WHERE MATCH(u.login, u.email, ud.name, ud.lastname, ud.mobile, ud.about, ud.company_name, ud.patent) AGAINST ('alex' IN BOOLEAN MODE) and u.validStatus = 1 and u.id = ud.user_id UNION SELECT p.id AS `ID`, u.onlineSatus AS `STATUS`, p.portfolio_img AS `IMG`,... from tori_portfolio as p, tori_users as u  where MATCH(p.name, p.lastname, p.about) AGAINST ('alex' IN BOOLEAN MODE) and search_status = 0 and u.validStatus = 1 and u.id = p.id_user UNION SELECT a.id AS `ID`, NULL AS `STATUS`,  NULL  AS `IMG`, ... FROM tori_adverts as a WHERE MATCH(a.title, a.description, a.keywords) AGAINST ('alex' IN BOOLEAN MODE) and validate = 1

    SELECT u.id AS `ID`, u.onlineSatus AS `STATUS`, ud.user_img AS `IMG`, ... FROM tori_users as u, tori_user_date as ud WHERE MATCH(u.login, u.email, ud.name, ud.lastname, ud.mobile, ud.about, ud.company_name, ud.patent) AGAINST ('alex' IN BOOLEAN MODE) and u.validStatus = 1 and u.id = ud.user_id UNION SELECT p.id AS `ID`, u.onlineSatus AS `STATUS`, p.portfolio_img AS `IMG`,... from tori_portfolio as p, tori_users as u where MATCH(p.name, p.lastname, p.about) AGAINST ('alex' IN BOOLEAN MODE) and search_status = 0 and u.validStatus = 1 and u.id = p.id_user UNION SELECT a.id AS `ID`, NULL AS `STATUS`, NULL AS `IMG`, ... FROM tori_adverts as a WHERE MATCH(a.title, a.description, a.keywords) AGAINST ('alex' IN BOOLEAN MODE) and validate = 1

  • А зачем алиасы во втором и прочих подзапросах? лишняя писанина. Сервер всё одно их отправит в игнор...
  • Akina, ну а для чего ставятся комментарии в коде, они ведь тоже никак не компилируются.
  • Page-Audit.ru, от комментария есть толк, если он грамотно написан. А вот от алиаса в подзапросе я лично никакого толка не наблюдаю. Если уточнить аналогию, то алиасы в подзапросе - это комментарий во втором цикле, практически полностью дублирующем предыдущий (в смысле и цикл дублируется, и комментарий к нему тоже дубль). От такого комментария толку даже меньше, чем ноль - ведь надо затратить время и умственные усилия, чтобы и прочитать, и понять, что ничего нового из него не извлечь.

    Нет, если Вы видите смысл - хорошо. Но я обычно воспринимаю алиасы в UNION-подзапросах как издержки копипаста.

  • Akina, я то сам не SQL-щик, учил чистый ANSI SQL лет 30 назад в ВУЗе. Как научили, так обычно и пишу, мне так удобно. А автор вопроса как вырастет в познаниях SQL, сам удалит или будет писать, как ему удобно или оптимально.
Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Максим Павлов Ответ

Для реализации поиска по разным таблицам с разными полями в базе данных можно воспользоваться SQL запросами, используя операторы UNION и JOIN.

Прежде всего, необходимо определить, какие таблицы и поля в них будут участвовать в поиске. Предположим, у нас есть таблицы "users" и "products", и нам нужно искать по полям "name" и "description" в каждой из них.

Пример SQL запроса для поиска по обеим таблицам и полям может выглядеть следующим образом:

SELECT * FROM users WHERE name LIKE '%search_query%'
UNION
SELECT * FROM products WHERE name LIKE '%search_query%'
UNION
SELECT * FROM products WHERE description LIKE '%search_query%'

SELECT * FROM users WHERE name LIKE '%search_query%' UNION SELECT * FROM products WHERE name LIKE '%search_query%' UNION SELECT * FROM products WHERE description LIKE '%search_query%'

В данном запросе используется оператор UNION для объединения результатов поиска из разных таблиц. Таким образом, мы можем выполнить поиск по полю "name" в таблицах "users" и "products", а также по полю "description" только в таблице "products".

Если необходимо выполнить поиск по нескольким полям в разных таблицах, можно воспользоваться операторами JOIN и WHERE для объединения таблиц и задания условий поиска. Например:

SELECT users.*, products.* FROM users
JOIN products ON users.user_id = products.user_id
WHERE users.name LIKE '%search_query%' OR products.name LIKE '%search_query%'

SELECT users.*, products.* FROM users JOIN products ON users.user_id = products.user_id WHERE users.name LIKE '%search_query%' OR products.name LIKE '%search_query%'

В данном запросе используется оператор JOIN для объединения таблиц "users" и "products" по общему полю "user_id". Затем с помощью оператора WHERE задаются условия поиска по полям "name" в таблице "users" и "products".

Таким образом, с помощью сочетания операторов SQL можно реализовать поиск по разным таблицам с разными полями в базе данных.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно