【问题标题】:SQL - Using placeholders to retrieve rows that are LIKE the placeholderSQL - 使用占位符检索类似于占位符的行
【发布时间】:2019-07-25 20:24:00
【问题描述】:

我有 3 张桌子;

饮料

食物

饮料

Drink tbl 通过 RestID 加入到 Restaurant,Food tbl 通过 RestID 加入到 Restaurant

我正在尝试创建一个执行以下操作的查询;

  • 用户输入他们想要的食物(例如汉堡)
  • 用户输入他们想要的饮料(例如 Guinness)
  • 查询返回提供这两种食物的餐厅

我正在尝试创建一个查询,检查输入的饮料是否在 Drinks 表中的 drinkvarietydrinkname 列中是 LIKE 文本,并检查输入的食物是否是 foodcategoryfoodname 中的 LIKE 文本在食物表中。只有当查询输入的占位符是 LIKE 任一列时,餐厅才会作为结果返回。

我已尝试使用它创建此查询,但语法一定是错误的,因为它没有按预期返回;

SELECT DISTINCT r.restname
FROM restaurants r
JOIN food f ON f.restid = r.restid
JOIN drinks d ON d.restid = r.restid
WHERE f.foodcategory LIKE '%?%'
  AND d.drinkvariety LIKE '%?%'

注意:以上内容目前仅检查每个表的 1 列。我知道,但它仍然不起作用。

任何帮助将不胜感激。

【问题讨论】:

  • 素食区呢?
  • 对不起...什么?素食区怎么样,抱歉我很困惑......

标签: mysql sql wildcard placeholder


【解决方案1】:

您不能将? 参数占位符放在查询中带引号的 SQL 字符串文字中。参数是使用字符串文字的替代方法。

我会这样写查询:

SELECT DISTINCT r.restname
FROM restaurants r
JOIN food f ON f.restid = r.restid
JOIN drinks d ON d.restid = r.restid
WHERE f.foodcategory LIKE ?
AND d.drinkvariety LIKE ?

然后我会将参数作为字符串传递,在我的应用程序中将 '%' 附加到字符串变量之后。

替代方案:在 SQL 中添加和添加通配符,但将参数占位符分开。

SELECT DISTINCT r.restname
FROM restaurants r
JOIN food f ON f.restid = r.restid
JOIN drinks d ON d.restid = r.restid
WHERE f.foodcategory LIKE CONCAT('%', ?, '%')
AND d.drinkvariety LIKE CONCAT('%', ?, '%')

对于任何一种解决方案,占位符都不能位于 SQL 字符串文字内。

否则,您将如何在 SQL 中搜索文字问号?

【讨论】:

    【解决方案2】:

    使用exists:

    SELECT r.restname
    FROM restaurants r
    WHERE EXISTS (SELECT 1
                  FROM food f 
                  WHERE f.restid = r.restid AND
                         f.foodcategory LIKE CONCAT('%', ?, '%')
                 ) AND
          EXISTS (SELECT 1
                  FROM drinks d
                  WHERE d.restid = r.restid AND
                        d.drinkcategory LIKE CONCAT('%', ?, '%')
                 ) ;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-12
      • 1970-01-01
      • 1970-01-01
      • 2017-09-21
      • 2019-03-25
      • 1970-01-01
      • 2013-09-13
      相关资源
      最近更新 更多