0

我遇到了一个我无法掌握的问题,这让我发疯了。

我正在使用子查询进行查询,其中我使用变量重新格式化某些值

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 会话时,都会发生这种情况,然后它就永远不会发生。所以我猜这些变量被存储在某个地方。我尝试清理缓存并刷新表,但结果是一样的。

有任何想法吗?

干杯

4

1 回答 1

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 参考说:

作为一般规则,您永远不应为用户变量赋值并在同一语句中读取该值。您可能会得到预期的结果,但这不能保证。涉及用户变量的表达式的求值顺序是未定义的,并且可能会根据给定语句中包含的元素而改变;此外,不保证此顺序在 MySQL 服务器的版本之间是相同的。

此任务适合用于显示和格式化从数据库检索的数据集的客户端应用程序/报告工具。

您将很难在 SQL 中轻松做到这一点,因为在关系表中,每一行都独立于其他行(即使集合是有序的)。在某些 DBMS 中可能有使用分析函数的方法来实现这一点,但实际上我强烈建议您使用显示结果集的过程语言来执行此操作 - 一个简单的过程循环,其中包含一些变量来跟踪先前的系列/亚科应该可以解决问题。

于 2012-04-26T13:45:40.137 回答