如何从LIKE

时间:2017-08-06 22:17:55

标签: php mysql

我想基于搜索查询显示行。 但是,我有3个表,并且想要在所有3个表中搜索,如果某些内容是LIKE('%$ parameter%')参数。

这是我目前的代码:

SELECT a.Name as aName
     , b.Name as bName
     , c.Name as cName 
  FROM TableA a
     , TableB b
     , TableC c 
 WHERE a.Name LIKE '%$parameter%' 
    OR b.Name LIKE '%$parameter%' 
    OR c.Name LIKE '%$parameter%'

在PHP中,我执行以下操作:

if($row['aName'] != ""){ echo $row['aName']; }
if($row['bName'] != ""){ echo $row['bName']; }
if($row['cName'] != ""){ echo $row['cName']; }

但是这......只是抛弃了所有表中的每一行,即使它们甚至不匹配参数。

我在google或stackoverflow上找不到任何有用的东西。

请帮忙!

2 个答案:

答案 0 :(得分:1)

没有任何加入表格的条件你只需要制作笛卡尔积(称为Cross Join),所以你需要添加相互连接表的条件:

SELECT a.Name as aName
     , b.Name as bName
     , c.Name as cName 
  FROM TableA a
  INNER JOIN TableB b
         a.name = b.name /* they are should have the same data for matching OR if it's OK then you can use your "Primary Key Columns" for matching other tables*/
  INNER JOIN TableC c 
         ON a.name = c.name
  WHERE 
      a.Name LIKE '%$parameter%' 
      OR b.Name LIKE '%$parameter%' 
      OR c.Name LIKE '%$parameter%';

答案 1 :(得分:1)

你应该更新你的sql,这样它不会返回3列而是1列,它也会简化你的php:

 SELECT a.Name as aName
  FROM TableA a
  WHERE a.Name LIKE '%$parameter%' 
 union
  SELECT b.Name as bName
  FROM TableB b
  WHERE b.Name LIKE '%$parameter%' 
 union
  SELECT c.Name as cName
  FROM TableC c
  WHERE c.Name LIKE '%$parameter%' 

通过这种方式,您将只获得匹配的线条,您将在3个桌子之间避免不必要的完整笛卡尔积。