在 mysql 中创建一个可选的 Where 子句

Posted

技术标签:

【中文标题】在 mysql 中创建一个可选的 Where 子句【英文标题】:Make an optional Where Clause in mysql 【发布时间】:2014-10-02 05:07:32 【问题描述】:

这是fiddle example。

谁能告诉我如何在这个语句中添加一个可选的 Where 子句?

SELECT u.user_id,u.name,.u.shipping_countries,
       u.contact,s.toy_id,s.price
FROM User u 
LEFT JOIN Sales_info s ON u.user_id = s.user_id
LEFT JOIN Toy t ON s.toy_id = t.toy_id
WHERE u.name = 'John' 
( ???AND s.toy_id = '222' ???)

我的预期输出应该是:

USER_ID NAME    SHIPPING_COUNTRIES  CONTACT TOY_ID  PRICE
3        John   Europe              gmail   222     (null)

CASE 可能有用吗?我试过Case When s.toy_id = '222' ELSE 1=1 END,但显然不正确。

背景:

我有一个 html 表单,如果卖家也在销售他们正在浏览的产品,它允许卖家在每个产品页面上提交他们的价格。

表单是通过 Ajax 动态拉入的。我想首先进行查询,以尝试从卖方表中检索一些基本信息(如果有的话)以填写尽可能多的输入表格。例如,如果他们已经在其他页面上填写了发货国家和联系方式等基本信息,那么这些详细信息将是在玩具 B 页面上拉入时输入表单中的默认值。

  <form>
    <input type='hidden' value='222' name='toy_id'/>
    <input type='text' value='Tom' name='user_name'/>
    <input type='text' value='' name='product_page_url'/>
    <input type='text' value='' name='price'/>
    <input type='text' value='Europe,Asia' name='shipping_countries'/>
    <input type='text' value='my@gmail.com' name='contact'/>
    <input type='submit'>
   </form>

如果他们已经提交了玩具 B 的价格,表格将显示他们之前输入的所有值,以便他们可以修改/更新它们。

【问题讨论】:

where foo='bar' or foo is null? @MarcB 不。不起作用。如果用户在 sales_info 中有其他玩具,则该用户的所有行都将加入 - 没有 s.toy_id 为 null 的行,也没有用户 John 和 toy_id 222 的行,因为用户 john 的所有行都有其他玩具 id 【参考方案1】:

如果您总是想匹配一个玩具 ID,但前提是该用户出售该玩具,那么您可以加入该玩具的子选择:

SELECT u.user_id,u.name,.u.shipping_countries,
       u.contact,s.toy_id,s.price
FROM User u 
LEFT JOIN (select * from Sales_info where toy_id = 222) s ON u.user_id = s.user_id
LEFT JOIN Toy t ON s.toy_id = t.toy_id
WHERE u.name = 'John'

这样,如果该玩具的用户与所选用户不匹配,左联接仍会负责为您提供来自用户表的信息。

请注意这在大型数据库上的有效性,因为我们不能在连接中使用索引。但是,如果我们总是从 dales_info 中选择一行,那么我希望它应该不会太糟糕。它至少有效。

【讨论】:

以上是关于在 mysql 中创建一个可选的 Where 子句的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 4:可选 where 子句

LINQ---查询表达式的结构

如何在sql中创建动态where子句?

MySQL删除表数据

SQL查询where子句如果没有匹配记录则省略

可选的SSRS参数