我遇到了一个我无法掌握的问题,这让我疯狂。
我正在使用子查询进行查询,其中我使用变量重新格式化某些值
SELECT
IF(qry.pFamily=@lastFamily,'',@lastFamily:=qry.pFamily) AS family,
IF(qry.pSubFamily=@lastSubFamily,'',@lastSubFamily:=qry.pSubFamily) AS subFamily,
qry.pUid AS qUID,
qry.pPlu AS qPLU,
qry.pDescription AS qDesc,
replace(round(qry.pSalesPrice/100,2),'.',',') as pPrice
FROM (
SELECT
@lastFamily ='',
@lastSubFamily ='',
IF(sf.RecordDeleted=0,
SUBSTR(concat(f.description,"\n"),1,20),
SUBSTR(concat("Sem familia\n"),1,20)) AS pFamily,
IF(sf.RecordDeleted=0,
SUBSTR(concat(" ",sf.description,"\n"),1,30),
SUBSTR(concat(""),1,30))
AS pSubFamily,
p.ItemID AS pUid,
IF(p.ProductLookUp IS NULL,'0',p.ProductLookUp) AS pPlu,
SUBSTR(p.ShortDescription1,1,20) AS pDescription,
SUBSTR(prop.SalesPrice1,1,10) AS pSalesPrice
FROM plus p
INNER JOIN properties prop on p.PropertyUID = prop.uid
INNER JOIN families f on p.FamilyID = f.UID
INNER JOIN subFamilies sf on p.SubFamilyID = sF.UID
WHERE p.RecordDeleted=0
ORDER BY pFamily, pSubFamily,pDescription
) AS qry;
使用变量lastFamily和lastSubFamily背后的想法是替换重复的文本以获得干净的,随时可用的结果集。
在第一轮比赛中我得到了
'Bebida', ' Agua', '22', ?, '1/4 Castelo', ?
'Bebida', ' Agua', '23', ?, 'Agua 0.33cl', ?
'Bebida', ' Agua', '24', ?, 'Agua 0.50cl', ?
'Bebida', ' Agua', '25', ?, 'Agua 1.5l', ?
'Bebida', ' Agua', '26', ?, 'Agua c/Sabor', ?
'Bebida', ' Agua', '27', ?, 'Agua Gás', ?
'Bebida', ' Alcoolica', '1', ?, 'Alianca Velha', ?
(etc...)
但是我第二次运行查询时得到了预期的结果
'Bebida', ' Agua', '22', ?, '1/4 Castelo', ?
'', ' ', '23', ?, 'Agua 0.33cl', ?
'', ' ', '24', ?, 'Agua 0.50cl', ?
'', ' ', '25', ?, 'Agua 1.5l', ?
'', ' ', '26', ?, 'Agua c/Sabor', ?
'', ' ', '27', ?, 'Agua Gás', ?
'', ' Alcoolica', '1', ?, 'Alianca Velha', ?
(etc...)
我的问题是如何(在哪里)初始化lastFamily和lastSubFamily,以便在第一次运行时设置它们。
每次我启动一个新的mysql会话时都会发生这种情况,然后就不会发生了。所以我猜这些变量存储在某个地方。我尝试清理缓存并刷新表,但结果是一样的。
有什么想法吗?
干杯
答案 0 :(得分:1)
听起来您正在尝试使用SQL生成交叉表报告以隐藏"重复"价值......你只想要"分组"列出现一次,然后空白表示其余行。
Family SubFamily qUID qPLU qDesc qPrice
-----------------------------------------------------------
Bebida Auga 22 ? 1/4 Castelo ?
23 ...
24 ...
25 ...
26 ...
27 ...
Alcoolica 1 ...
Family2 SubFamily1 15
16
SubFamily2 15
16
请注意,MySQL reference表示:
作为一般规则,您不应该为用户变量赋值 并在同一语句中读取值。你可能会得到 你期望的结果,但这不能保证。的顺序 涉及用户变量的表达式的评估是未定义的 可能会根据给定声明中包含的元素进行更改; 另外,这个顺序不保证是相同的 发布MySQL服务器。
此任务 更适合客户端应用程序/报告工具,该工具正在显示和格式化从数据库中检索的数据集。
您很难在SQL中轻松完成此操作,因为在关系表中,每一行都独立于其他行(即使在订购该集合时也是如此)。在某些DBMS中可能存在使用分析函数来实现此目的的方法,但实际上我强烈建议您使用显示结果集的过程语言来执行此操作 - 一个简单的过程循环,其中包含一些变量以跟踪先前的家庭/家庭应该做的伎俩。