sql - 查询搜索主表和关联表

问题描述 投票:0回答:1

我正在尝试在我的网站上创建一个搜索功能,该功能在主表中的多个列中搜索关键字,以及与通过关联表链接的这些关键字相匹配的任何标签。

我有一个仅适用于关键字的查询,以及一个可以找到 1 个标签的查询,但我希望在一个查询中同时完成这两个操作。

结合我的 2 个工作查询,我想出了这个查询

SELECT * FROM flight_trips
WHERE MATCH (destination_country, destination_city, outbound_airport, return_airport, inbound_airport, accommodation_name) AGAINST (? IN BOOLEAN MODE)
AND status = ?
UNION
SELECT * FROM flight_trips
INNER JOIN trip_tags ON trip_tags.trip_id = flight_trips.id WHERE ".$tagsql." AND flight_trips.status = ? ORDER BY added_timestamp DESC

$tagsql 是使用每个关键字并添加

" OR "

构建的

此查询失败并出现错误

The used SELECT statements have a different number of columns
,我假设这是因为 JOIN 添加了列,但它们没有相加。

我希望能够搜索“beach alicante”并找到 MATCH 子句中与“beach”或“alicante”匹配的所有结果,并在我的

tags
表中搜索“beach”和“alicante”,以及链接到这些标签的任何记录。 (海滩将是链接到记录的标签,阿利坎特将位于主表中的目的地城市中)。

我无法理解这个问题,希望得到任何帮助!我搜索了又搜索,但我实际上不知道我在寻找什么来找到这个问题的答案。

flight_trips

INSERT INTO `flight_trips` (`id`, `destination_country`, `destination_city`, `destination_currency`, `outbound_airport`, `airline_depart`, `return_airport`, `airline_return`, `inbound_airport`, `outbound_takeoff`, `outbound_landing`, `inbound_takeoff`, `inbound_landing`, `flight_cost`, `overnight_stay`, `accommodation_cost`, `accommodation_name`, `airport_transfer_type`, `airport_transfer_cost`, `airport_transfer_duration`, `trip_details`, `rating`, `user_name`, `user_email`, `added_timestamp`, `approved_timestamp`, `status`) VALUES
(2, 'Spain', 'Alicante', 'Euro', 'London Gatwick', '', '', '', 'Alicante Airport', 1699423800, 1699429200, 1699481700, 1699487100, 45.00, 0, 0.00, '', 'bus', 8, 60, '', 2, 'Someone', '[email protected]', 1699313293, 0, 'approved');

tags
桌子

INSERT INTO `tags` (`id`, `name`) VALUES
(6, 'beach');

将标签与行程链接起来的表格

INSERT INTO `trip_tags` (`id`, `trip_id`, `tag_id`) VALUES
(1, 2, 6);

提前致谢

sql mysqli myisam
1个回答
0
投票

该错误意味着您在第一个选择和第二个选择中返回的列数不同。您不能将不同数量的列和名称合并到一个联合中。

一个可能的解决方案是在 * 末尾的第一个联合中添加 3 个虚拟列。通过这样做,您还需要在第二个选择中声明列。

示例:

SELECT *, NULL As trip_tag_id, NULL As Trip_ID, NULL AS Tag_ID FROM flight_trips
WHERE MATCH (destination_country, destination_city, outbound_airport, return_airport, inbound_airport, accommodation_name) AGAINST (? IN BOOLEAN MODE)
AND status = ?
UNION
SELECT ft.*, T.id AS trip_tag_id, T.Trip_ID, T.Tag_ID  FROM flight_trips ft
INNER JOIN trip_tags T ON trip_tags.trip_id = flight_trips.id WHERE ".$tagsql." AND flight_trips.status = ? ORDER BY added_timestamp DESC
© www.soinside.com 2019 - 2024. All rights reserved.