现在我做两个单独的SQL语句,一个基于与搜索语句基本相同的标准执行SELECT COUNT(*)
。我不是最好的做出这些陈述,有时候有点慢,我想知道是否有更好的方法来做我做的事情。可能只在PHP中执行一个SQL语句和一些其他工作?这是一个示例“搜索包含”我有声明。
在第二个语句中,您将看到Y之间的X,它部分由第一行计数语句的结果计算。
SQL行计数:
SELECT COUNT(*)
FROM itemmast
LEFT OUTER JOIN itemweb
ON iline = line
AND iitem = item
JOIN linemst
ON iline = lline
LEFT OUTER JOIN custord
ON opline = iline
AND opitem = iitem
AND opcust = '12345'
LEFT OUTER JOIN ordwdtl
ON owline = iline
AND owitem = iitem
AND owusr ='user'
AND owcust ='12345'
WHERE ico = 01
AND iecomm = 'Y'
AND (UPPER(ITEMDESC) || UPPER(PRODDESC)) LIKE '%FOO%'
OR LINE LIKE '%FOO%'
OR UPPER(MFGNAME) LIKE '%FOO%'
OR UPPER(ITEM) LIKE '%FOO%'
OR UPPER(PRODNAME) LIKE '%FOO%'
OR UPPER(IDESC1 || IDESC2) LIKE '%FOO%'
OR UPPER(IMFGNO) LIKE '%FOO%'
OR UPPER(IITEM) LIKE '%FOO%')
SQL搜索:
SELECT *
FROM (SELECT iline AS line, iitem AS item, rownumber() OVER (ORDER BY item) AS ROW_NUM
FROM itemmast
LEFT OUTER JOIN itemweb
ON iline = line
AND iitem = item
JOIN linemst
ON iline = lline
LEFT OUTER JOIN custord
ON opline = iline
AND opitem = iitem
AND opcust = '12345'
LEFT OUTER JOIN ordwdtl
ON owline = iline
AND owitem = iitem
AND owusr = 'user'
AND owcust = '12345'
WHERE ico = 01
AND iecomm = 'Y'
AND (UPPER(ITEMDESC) || UPPER(PRODDESC)) LIKE '%FOO%'
OR LINE LIKE '%FOO%'
OR UPPER(MFGNAME) LIKE '%FOO%'
OR UPPER(ITEM) LIKE '%FOO%'
OR UPPER(PRODNAME) LIKE '%FOO%'
OR UPPER(IDESC1 || IDESC2) LIKE '%FOO%'
OR UPPER(IMFGNO) LIKE '%FOO%'
OR UPPER(IITEM) LIKE '%FOO%'))
AS TEMP
WHERE ROW_NUM BETWEEN 0 AND 25
答案 0 :(得分:6)
如果您尝试在分页计数旁边显示结果总数(那么“38”中的0到25),单独的声明可能是您最好的选择。我尝试了很多方法来计算各行的数量,但性能(即使是在中等的测试数据库中)也很糟糕。
你可能应该做的是创建一个你可以查询的视图,其中包含你所有的选择标准,然后用必要的行为包装它:
数:
SELECT COUNT(*)
FROM view
排名行:
SELECT *
FROM (SELECT *, ROW_NUMBER() OVER(ORDER BY item) as RANK
FROM view) as TEMP
WHERE RANK BETWEEN 0 AND 25
您当然需要在条件中添加相对值,但这是视图要处理的事物的类型。
如果您实际上不需要提前知道总行数,则可以简单地将结束等级设置为起始等级加上一些偏移量。然后,当您使用PHP显示结果时,只需编辑结束显示值。
一些随机笔记:
1)是否有line
不是upper()
d?的原因
2)由于所有的字符串操作/比较,这个查询的性能几乎无论你做什么都会受到影响。有可能消除或忽略某些条件吗?除非在各个字符串列上使用的标记已经应用upper
(DB2的某些更高版本允许将某些标量函数应用于索引键),否则大多数指标将完全无用(它不会t毕竟帮助你寻找%ANYTHING%
。
好吧,有一种“棘手”的方法来做这样的事情,似乎表现得不错...... 尝试这样的事情(首先定义的视图真的会有帮助):
SELECT TEMP.*, CASE WHEN RANK = 0 THEN (SELECT COUNT(*)
FROM view)
ELSE 0 END
FROM (SELECT *, ROW_NUMBER() OVER(ORDER BY item) as RANK
FROM view) as TEMP
WHERE RANK BETWEEN 0 AND 25
当然,您仍然必须在子选择中定义where
子句...