这里有一个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)

是否可以工作?我试过了,但显然不对。
背景:
我有一个html表单,允许卖家提交他们的价格在每一个产品页面上,如果他们也销售他们正在浏览的产品。
表单通过Ajax动态地拉入。我想先做一个查询,尝试从seller表中检索一些基本信息(如果有的话),以尽可能多地填写输入表单。例如,如果他们已经在其他页面上填写了基本信息,如发货国家和联系人,那么当他们被拉到玩具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='[email protected]' name='contact'/>
    <input type='submit'>
   </form>

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

最佳答案

如果您始终希望匹配一个玩具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中选择一行,我希望这不会太糟。至少可以。

10-07 21:32