鉴于您使用ILIKE
,您可能尝试过使用 PostgreSQL - 它似乎允许LIMIT
在单个语句中使用多个 s。(从这个SQL Fiddle判断,与您的语句相比 - ndm.table1已更改为table1,并且(FK)下降了两次)。
但即使经过调整
SELECT
*
FROM table1
WHERE
T1id1 IN
(select
T1id1
from table1
where
T1id1 NOT IN
(select T1id1
from table1
where
T1id1 in
(select distinct
T1id1
from table2
WHERE
table2.col1 like '%text2%'
)
LIMIT 100
)
AND T1id1 in
(select distinct
T1id1
from table2
WHERE
table2.col1 like '%text2%'
limit 200
)
and
table1.col1 ilike '%text2%'
LIMIT 100
)
;
似乎被 PostgreSQL 接受 - 它不太可能返回预期的结果:
使用 LIMIT 时,使用 ORDER BY 子句将结果行约束为唯一顺序很重要。否则,您将获得查询行的不可预测的子集。您可能要求第 10 到第 20 行,但第 10 到第 20 行的顺序是什么?排序是未知的,除非您指定了 ORDER BY。
来自 PostgreSQL 9.3 文档7.6 LIMIT 和 OFFSET。
仅从您的问题描述开始(并在您的陈述中查看一些细节),类似于以下内容
SELECT
T1.*
FROM Table1 T1
JOIN Table2 T2
ON T1.t1id1 = T2.t1id1
AND INSTR(T1.col1, 'teXT1')
AND INSTR(T2.col1, 'teXT2')
ORDER BY T1.t1id1, T2.id
LIMIT 1 OFFSET 0
;
SELECT
T1.*
FROM Table1 T1
JOIN Table2 T2
ON T1.t1id1 = T2.t1id1
AND INSTR(T1.col1, 'teXT1')
AND INSTR(T2.col1, 'teXT2')
ORDER BY T1.t1id1, T2.id
LIMIT 1 OFFSET 1
;
SELECT DISTINCT
T1.*
FROM Table1 T1
JOIN Table2 T2
ON T1.t1id1 = T2.t1id1
AND INSTR(T1.col1, 'teXT1')
AND INSTR(T2.col1, 'teXT2')
ORDER BY T1.t1id1, T2.id
LIMIT 1 OFFSET 0
;
应该让你进入正确的方向。您是否需要在DISTINCT
某种程度上取决于您的数据 - 但更重要的是取决于您的整体需求。请比较 SQL Fiddle 下面的语句 1 到 4 到 5 到 7 以了解效果。
LIMIT
最主要的是结合OFFSET
- 你似乎试图找到你自己的替代品。
除此之外:通配符位于字符串的两端,INSTR
具有与LIKE
- 但在某些情况下更有效的选择性......
记住您的使用ILIKE
:只要比较中不涉及二进制字符串,MySQL 中LIKE
也不区分大小写。INSTR
实际操作:SQL Fiddle。
如果需要调整/进一步详细信息,请发表评论。