【问题标题】:SELECT in the WHERE LIKE clauseWHERE LIKE 子句中的 SELECT
【发布时间】:2019-06-02 20:46:49
【问题描述】:

我有以下 SQL 查询:

SELECT * FROM `test2`
WHERE text LIKE (SELECT concat(startswith,"%") from test1 ORDER BY RAND() LIMIT 1)

基本上我想从 test1 表中选择一行,然后从 test2 表中找到所有以 test1 中 startswith 列中的字符开头的记录。

但是这个查询并没有这样做。我哪里错了?

这里是查询中的表格

SELECT * FROM `test1`

startswith
==========
aaa 
bbb 
ccc 

SELECT * FROM `test2`

text
====
aaa3k123k12312p03edwqeq 
aaa12313fwefrwerw   
aaafwre3we4232  
bbb123123rwqe12e1   

【问题讨论】:

  • 只需从子查询中删除 ORDER BY 和 LIMIT?
  • @jarlh,如果我这样做,我会收到“子查询返回超过 1 行”错误。
  • 当然...做一个 JOIN intead!

标签: mysql sql select subquery sql-like


【解决方案1】:

您的代码没有给您期望的结果的原因(例如,对于您的示例数据,有时它会返回以aaabbb 开头的值,或者您可能无法获得所有以@ 开头的值987654324@) 是 WHERE 条件被评估为 test2 的每一行。这意味着对于 test2 中的每一行,比较一个 新的随机 值,这可能导致(可能)匹配所有行,或者不匹配,即使 test1 中的所有值都是开始test2 中的值。

解决这个问题的方法是从您的子查询创建一个派生表 - 这样它只会被评估 一次 - 然后使用 LIKE 比较 JOINtest2使用:

SELECT t2.*
FROM (SELECT startswith FROM test1 ORDER BY RAND() LIMIT 1) t1
JOIN test2 t2 ON t2.text LIKE CONCAT(t1.startswith, '%')

Demo on dbfiddle

请注意,如果startswith 是“ccc”,您将不会在示例数据的输出中得到任何结果。

【讨论】:

    【解决方案2】:

    移动子查询,然后JOIN:

    SELECT text
    FROM `test2`
    JOIN (select startswith from test1 ORDER BY RAND() LIMIT 1) t1
        ON text LIKE concat(startswith,"%")
    

    【讨论】:

    • 这将只返回 test2 中以 test1 中 startwith 的 any 开头的所有行。我想从 test1 表中随机选择一个 startwith。
    • 这给了我错误:“每个派生表都必须有自己的别名”。见:dbfiddle.uk/…
    • 我明白了,有些产品需要,有些则不需要。将编辑。
    【解决方案3】:

    像这样在连接中使用子选择

    select t2.* from test2 as t2 join (SELECT RAND() as rand, startswith from test1 ORDER BY rand LIMIT 1) as t1 where t2.txt like CONCAT(t1.startswith,"%");
    

    【讨论】:

      【解决方案4】:

      您的代码似乎是这样的SELECT * FROM test2WHERE text LIKE ==========% 没有引号。 如果您在查询中放置临时数据,它还会得到结果吗? 像

      SELECT * FROM `test2`
      WHERE text LIKE aaa%  -->> will not run, should have quotations
      

      还有这个

      SELECT * FROM `test2`
      WHERE text LIKE 'aaa%'
      

      完成您的代码

      SELECT * FROM `test2`
      WHERE text LIKE Concat((SELECT startswith from test1 ORDER BY RAND() LIMIT 1), "%") 
      

      【讨论】:

      猜你喜欢
      • 2018-03-08
      • 1970-01-01
      • 2020-09-27
      • 2015-10-08
      • 1970-01-01
      • 2022-01-08
      • 2013-06-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多