我正在尝试实现一个搜索功能,它不仅在一个表(任务)中搜索,而且在另一个相关表(活动)中搜索。Activities有一个列名称task,用于标识它所属的任务(即tasks表中的列keyid)。我搜索任务表的方式是:
SELECT
tasks.*
FROM
tasks
WHERE
(
(
tasks.description LIKE '%$search%'
OR tasks. NAME LIKE '$search%'
)
AND tasks. USER = '$userid'
);
我搜索活动表的方式是:
SELECT DISTINCT
tasks.*
FROM
activities,
tasks
WHERE
tasks. USER = '1'
AND activities.description LIKE '%$search%';
单独的查询起作用,并且它们都返回任务表数据。我想做的是合并这两个结果(在php中),这样我只得到所有的表任务条目,而不会重复。
我该怎么做?
要么执行两个查询,然后使用array_merge()
的变体合并结果(注意可能的重复),要么简单地用OR
运算符连接两个SELECT
语句中的WHERE
子句:
SELECT
DISTINCT tasks.*
FROM
activities,
tasks
WHERE
(
(
tasks.description LIKE '%$search%'
OR tasks.NAME LIKE '$search%'
)
AND tasks.USER = '$userid'
)
OR
(
tasks.USER = '$userid'
AND activities.description LIKE '%$search%'
);
应用一些布尔优化:
SELECT
DISTINCT tasks.*
FROM
activities,
tasks
WHERE
tasks.USER = '$userid'
AND
(
tasks.description LIKE '%$search%'
OR tasks.NAME LIKE '$search%'
OR activities.description LIKE '%$search%'
);
不管怎样,看到你的代码,我当然希望你能通过仔细地清理数据来保护自己免受SQL注入的影响,或者使用PDOStatement::bindParam
来处理这些问题。