【问题标题】:SELECT * FROM MULTIPLE TABLE in search QUERYSELECT * FROM MULTIPLE TABLE 在搜索查询中
【发布时间】:2018-05-10 22:20:06
【问题描述】:

我正在使用 php/mysql 搜索家具网站。

我使用了这样一个简单的搜索查询:

$sql = "SELECT * FROM produitsoutdoor_new WHERE CONCAT(nom, dimensions, coloris, descriptif, composition, matiere, stock) LIKE '%$keyword%'";

但是当我尝试添加一些其他类似的表格时:

$sql = "SELECT * FROM produitsoutdoor_new, produitssalon, produitsdecoration WHERE CONCAT(nom, dimensions, coloris, descriptif, composition, matiere, stock) LIKE '%$keyword%'";

结果为空。知道在这种情况下我应该如何使用JOIN 吗?

【问题讨论】:

  • 在 table2field = table1field 上使用 INNER JOIN 表
  • INNER JOIN 将仅显示 ID 存在于所有 3 个表中的值。如果联接表中可能不存在值,请使用 LEFT JOIN
  • 正确的方法是使用 UNION。此外,OP 的实际查询(他说不工作的那个)正在所有表之间执行笛卡尔计划。而且很可能是因为缺少别名而无法正常工作。
  • 谢谢大家。当我读到“所有表的架构都已标准化”时……我明白了。这些表的列不同,因此无法正常工作。所以我正常化了,现在它就像一个魅力。

标签: php mysql


【解决方案1】:

如果所有表的模式都被规范化,那么在mysql上创建连接查询很容易

你也可以在where条件下加入表格

如果我知道你的表,创建起来会更容易

你可以阅读更多 https://www.w3schools.com/sql/sql_join.asp

【讨论】:

    【解决方案2】:

    第二个查询返回“零行”有两种可能的解释:

    1) 添加的表之一(produitssalonproduitsdecoration)不包含任何行,或

    2) 代码忽略的 SQL 中存在错误(不明确的列引用,无效的表引用)


    关于你问的问题:

    问:在这种情况下我应该如何使用JOIN

    逗号运算符是连接操作的老派语法。您可以将逗号替换为 JOIN 关键字。

    SELECT p.*
      FROM produitsoutdoor_new p
         , produitssalon s
         , produitsdecoration d
     WHERE ... 
    

    等价于

    SELECT p.*
      FROM produitsoutdoor_new p
      JOIN produitssalon s
      JOIN produitsdecoration d
     WHERE ... 
    

    没有任何条件来“匹配”行,这将产生一个笛卡尔积......来自p 的每一行都与来自s 的每一行匹配,然后匹配到d 中的每一行。

    通常我们在ON 子句中包含匹配条件

    SELECT p.*
      FROM produitsoutdoor_new p
      JOIN produitssalon s
        ON s.p_id = p.id
      JOIN produitsdecoration d
        ON d.p_id = p.id
     WHERE ... 
    

    使用内连接,如果在连接表中没有找到匹配的行,则不会返回任何行。如果我们想在没有匹配的情况下返回行,我们可以使用外连接。我们可以通过包含关键字LEFT 来指定外连接:

    SELECT p.*
      FROM produitsoutdoor_new p
      LEFT
      JOIN produitssalon s
        ON s.p_id = p.id
      LEFT
      JOIN produitsdecoration d
        ON d.p_id = p.id
     WHERE ... 
    

    这是否适合这种特殊情况实际上取决于实际规范。拥有示例数据和预期输出将有助于澄清这一点。

    一些建议:

    用表名或表别名限定所有列引用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-26
      • 2019-06-26
      • 2022-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-13
      • 1970-01-01
      相关资源
      最近更新 更多