当前位置: 首页 > 面试题库 >

sql只获得表中的第一个记录行,我想要全部

太叔凌龙
2023-03-14
问题内容

有人已经帮助我进行了此查询,但我进行了修改,但遇到了一个问题:

    SELECT 
        AVG(tyd.price) AS avg_price, COUNT(tyd.id_product) AS cnt, 
        tyd.id_marchand, tyd.id_product, 
        catalog.price AS c_price, tyd.price AS t_price, 
        tyd.amount AS t_am, pro_tyd.amount AS p_am, 
        pro_tyd.price AS p_price, catalog.img_src,  
        tyd.step, tyd.login AS tyd_l
    FROM catalog 
    INNER JOIN tyd ON catalog.id_marchand = tyd.id_marchand 
                   AND catalog.id_product =   tyd.id_product
                   AND tyd.step = "1" 
    INNER JOIN pro_tyd  ON tyd.id_marchand = pro_tyd.id_marchand 
                        AND tyd.id_product = pro_tyd.id_product
    GROUP BY 
         catalog.id_product, catalog.id_marchand
    HAVING 
         tyd.login = "user1@tyd.fr"

并且仅tyd.login = "user3@tyd.fr"在较低的ID时有效。不适用于user1或user2
…我只是想不通为什么…!如果我按tyd.login分组,它也可以工作,但在这种情况下,AVG和COUNT函数只能在一行上工作…

这是表格:

id  id_marchand  id_product   login       price  amount  delay  step    time   
29      1           1       user3@tyd.fr   344     1       0      1   1343297500
120     1           1       user1@tyd.fr   54      1       0      1   1343297504
109     1           1       user10@tyd.fr  34      1       0      1   1343298598

HAVING tyd.login = "user3@tyd.fr"它完美地工作时。当user1或user2我有0行。

感谢您的帮助

第一个主题:Sql,在转义where条件的同时获取组的平均值


问题答案:

问题是您的查询是不确定的。您正在选择要分组的其他列,而其他列不是由分组的列确定的。如果后者是正确的,那么这将落入SQL的ANSII标准中,因为(在我看来)这并不是MySQL的失败,而是它允许语句完全运行。其他DBMS则采取相反的方式,因为它们无法确定某些列是否是group
by中未包含的其他列的功能,因此它们现在将允许选择列表中的列不在group by中的任何语句。

要尝试简化问题,请使用以下数据集(表T)

ID    Col1    Col2
1     1       1
2     1       3

运行此:

SELECT Col1, MAX(Col2) AS MaxCol2, MIN(Col2) AS MinCol2, AVG(Col2) AS AvgCol2
FROM T
GROUP BY Col1

永远会回来

Col1    MaxCol2    MinCol2    AvgCol2
1       3          1          2

但是,如果您ID加入其中

SELECT ID, Col1, MAX(Col2) AS MaxCol2, MIN(Col2) AS MinCol2, AVG(Col2) AS AvgCol2
FROM T
GROUP BY Col1

无法确定将返回哪个ID(1或2),最可能的结果是

ID    Col1    MaxCol2    MinCol2    AvgCol2
1    1       3          1          2

但是,SQL中未定义任何内容来表明结果不会是:

ID    Col1    MaxCol2    MinCol2    AvgCol2
2     1       3          1          2

因此,如果以上是结果集,并且已将其添加HAVING ID = 1到查询中,则由于将HAVING子句应用于数据的原因,您将不会获得任何结果。如果将ID添加到,则GROUP BY最终将有2行,据我了解,这不是您想要的,如果将ID添加到,则WHEREMIN,MAX和AVG函数将受到影响。因此,您需要使用子查询。因此,在此示例中,我将使用

SELECT  T.ID, T.Col1, MaxCol2, MinCol2, AvgCol2
FROM    T
        INNER JOIN
        (   SELECT Col1, MAX(Col2) AS MaxCol2, MIN(Col2) AS MinCol2, AVG(Col2) AS AvgCol2
            FROM T
            GROUP BY Col1
        ) T2
            ON T.Col1 = T2.Col1
WHERE   ID = 1 -- OR ID = 2 DEPENDING ON REQUIREMENTS

为了将这种情况应用到您的情况中,数据库引擎确定将针对不在group by中的列返回的行是包含ID =
29的行。因此,您的HAVING子句仅应用于该行,具有在应用HAVING子句时,已经从结果中删除了user1@tyd.fr和user10@tyd.fr。您需要分别执行聚合功能和过滤。

现在,我还没有完全了解您的模式,但是我希望我已经很好地解释了非确定性语句的问题,以便您可以对我重写查询的尝试做出必要的修改。

SELECT  Avg_Price,
        Cnt,
        tyd.id_marchand, 
        tyd.id_product, 
        catalog.price AS c_price, 
        tyd.price AS t_price, 
        tyd.amount AS t_am, 
        pro_tyd.amount AS p_am, 
        pro_tyd.price AS p_price, 
        catalog.img_src,  
        tyd.step, 
        tyd.login AS tyd_l
FROM    Catalog
        INNER JOIN tyd
            ON catalog.id_marchand = tyd.id_marchand 
            AND catalog.id_product = tyd.id_product
        INNER JOIN Pro_tyd
            ON tyd.id_marchand = pro_tyd.id_marchand 
            AND tyd.id_product = pro_tyd.id_product
        INNER JOIN
        (   SELECT  ID_Marchand, ID_Product, Step, AVG(tyd.price) AS avg_price, COUNT(tyd.id_product) AS cnt
            FROM    Tyd
            WHERE   Step = '1'
            GROUP BY ID_Marchand, ID_Product, Step
        ) Agg
            ON Agg.id_marchand = pro_tyd.id_marchand 
            AND Agg.id_product = pro_tyd.id_product
            AND Agg.Step = tyd.Step
WHERE   tyd.Login = 'user1@tyd.fr'


 类似资料:
  • 问题内容: 假设有两个表: 表A 表B 表之间的联系是 messageID 字段。 我想要一个查询来生成这样的结果,在该查询中,我将所有字段从表A中拉出,并对表B中每条消息的注释数进行计数,如下所示: 我已经尝试过这样的事情: 但这是行不通的。有任何想法吗?似乎应该可以在一个查询中执行此操作。我正在使用MSSQL。谢谢你的帮助。 问题答案: 标量子查询将起作用: 与往常一样,有很多方法可以改变这只

  • //jpa存储库代码到crud操作 @query(value=“select*from flatdetails fd inner join vehicledetailsid=veh.FlatDetailsid where veh.registrationNumber like%?1%and fd.tenantid=?2”,nativeQuery=true)列出findByRegistrationN

  • 我正在进行shell排序,但无法对列表中的第一个值进行排序。例如如果列表{7,2,6,4,5),则在对列表{7,2,4,5,6}进行排序之后。你们能帮忙吗!公共静态void segmentedInsertionSort(int[]list,int n,int h){int j;

  • 问题内容: 我有一个包含以下各列的模型: 我有索引和。 现在,我想获取由排序的每个对象的第一个日志。 一种方法是对每个用户名运行以下查询: 但这显然会查询数据库很多次(等于用户名的数量)。有什么方法可以只执行一个数据库查询吗? 问题答案: 另一种情况: 返回每个“第一”条目 的整行。 这种Ruby语法应该可以工作:

  • 问题内容: 在多表查询中,每条记录只能获得一行? 我有这三个表: 苹果 疲劳风险管理系统 FARM_APPLES 使用此表,我需要以下结果: 非常感谢您的任何帮助,在此先感谢您。 编辑 感谢OMG Ponies和Bill,我将尽力尝试您的两种解决方案,这是最后一件事,它有可能获得以下结果: 问题答案: Firebird 2.0支持CASE表达式,因此您可以使用:

  • 问题内容: 如标题所示,我想选择以分组的每组行的第一行和最后一行。 我在此表中包含以下数据: 我需要获取的是列开头的第一个值和列末尾的最后一个值,并按group by group列进行分组。 结果表应如下所示: 我使用和和进行了查询。它可以在SQL Server 2012中使用,但不能在SQL Server 2008中使用。我需要一个可以在SQL Server 2008中执行的查询。 问题答案: