MySQL在多列中搜索

时间:2016-07-29 18:34:25

标签: php mysql search

标题听起来很简单......主要问题是我应该查询的方向以及如何输出结果。

这是一个空搜索的屏幕截图:

enter image description here

客户端应始终可见(与搜索查询匹配)。所以这里举几个例子:

  • 搜索project2应该输出client2 with project2
  • 搜索client2应输出包含所有项目的client2
  • 搜索client3应输出client3

我查询项目并加入客户端,如下所示:

SELECT *
FROM projects AS a
LEFT JOIN clients AS b ON a.client_id = b.id
WHERE a.name LIKE '%$searchString%' OR b.name LIKE '%$searchString%'

之后我查询客户端,不包括上面查询中提取的客户端。这是(我知道的)唯一的方式让那些没有任何项目的客户。

是否有可以在查询中获取这些结果的语句?这对我来说似乎不太优雅。此外,如果我搜索client2 project1,系统将失败。

编辑:感谢目前为止的答案。我得到了很多在mysql中无法实现的完全连接。我在问题的标题和标签中改变了...对不起。我对完全连接一无所知,而且在mysql中它们是不可能的。

3 个答案:

答案 0 :(得分:1)

Here是SQL中不同连接类型的良好直观表示。

确保使用预准备语句,而不是直接将searchString放入查询中,因为这就是SQL注入攻击的发生方式。

SELECT
  *
FROM
  clients b LEFT OUTER JOIN
  projects AS a ON a.client_id = b.id
WHERE
  a.name LIKE '%$searchString%' OR
  b.name LIKE '%$searchString%'

答案 1 :(得分:0)

执行一个RIGHT JOIN,无论他们是否有项目,都会为您提供所有客户,然后WHERE a.name IS NULL将只为您提供没有项目的客户。

所以整个查询看起来像

SELECT *
FROM projects AS a
RIGHT JOIN clients AS b ON a.client_id = b.id
WHERE a.name IS NULL

答案 2 :(得分:0)

你可以写这个

    SELECT
      *
    FROM
      clients b FULL OUTER JOIN
      projects AS a ON a.client_id = b.id
    WHERE
      a.name LIKE '%$searchString%' OR
  b.name LIKE '%$searchString%'