Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql SQL分组依据(多个组) 编辑:似乎在sqlfiddle中工作。。。一定是发生在其他地方的错误。谢谢各位。_Mysql_Sql_Group By_Grouping - Fatal编程技术网

Mysql SQL分组依据(多个组) 编辑:似乎在sqlfiddle中工作。。。一定是发生在其他地方的错误。谢谢各位。

Mysql SQL分组依据(多个组) 编辑:似乎在sqlfiddle中工作。。。一定是发生在其他地方的错误。谢谢各位。,mysql,sql,group-by,grouping,Mysql,Sql,Group By,Grouping,我对SQL中的计数和分组非常感兴趣 重要的表格是交易商品-如果有人购买了4辆相同的自行车,每辆100磅,那么交易商品中插入了四行,每一行对应一个数量。这是有原因的,我不想要数量列 我需要做的是从charge_id='12345'的transaction_items中获取所有记录,并按transaction_items.usersid和transaction_items.item_代码对它们进行分组-最终为我提供一个组列表,每个组与唯一用户和唯一产品相关。因此,如果用户在购物车中有多个产品,则用户

我对SQL中的计数和分组非常感兴趣

重要的表格是交易商品-如果有人购买了4辆相同的自行车,每辆100磅,那么交易商品中插入了四行,每一行对应一个数量。这是有原因的,我不想要数量列

我需要做的是从charge_id='12345'的transaction_items中获取所有记录,并按transaction_items.usersid和transaction_items.item_代码对它们进行分组-最终为我提供一个组列表,每个组与唯一用户和唯一产品相关。因此,如果用户在购物车中有多个产品,则用户可以拥有多个组。如果用户1购买了2个项目1和4个项目2,则用户1将有两个组,一个组用于项目1,计数为2,另一个组用于项目2,计数为4。目前,我似乎只能得到一组

因此,如果我在事务项中有此项:

|  id  |  charge_id  |  usersid  |  item_code  |
|   1  |      12345  |       12  |         66  |
|   2  |      12345  |       12  |         66  |
|   3  |      66666  |       11  |         66  |
|   4  |      12345  |       12  |         66  |
|   5  |      12345  |        6  |         22  |
|   6  |      77777  |       10  |         66  |
|   7  |      12345  |       12  |         66  |
|   8  |      44444  |       23  |         66  |
|   9  |      12345  |        6  |         22  |
我想先按charge_id、usersid和item_代码对数据进行分组,我想把这些数据取回:

Array
(

    // The array should contain arrays for each pair of usersid's and item_codes, that all have the same charge_id

    [0] => Array
        (
            //This is a unique group for usersid and item_code

            [charge_id] => '12345'
            [usersid] => '12' 
            [item_code] => '66'
            [num_of_records] => '4'          
        )
    [1] => Array
        (
            //This is a unique group for usersid and item_code

            [charge_id] => '12345'
            [usersid] => '6'
            [item_code] => '22'
            [num_of_records] => '2'          
        )
)
所以我希望得到一个数组:

将具有相同费用id、用户SID和项目代码的所有记录分组 以可用的格式获取数据,计数就像数量一样 盘点数量应仅针对每个组,而不是所有记录 我现在得到的似乎只是一个产品ID,一个usersid,但是反映所有用户和项目的记录总数,与我的目标正好相反!下面的虚拟输出反映了上面示例表的使用:

Array
(
    [0] => Array
        (
            [charge_id] => '12345'
            [usersid] => '12'
            [item_code] => '66'
            [num_of_records] => '6'          
        )
)
我现在的问题是: 我错过了什么

谢谢

编辑和更新 这完全取决于WHERE条款。当我删除它时,查询工作正常,但会收集items表中的所有记录,而我只需要charge_id='12345'的记录。因此,我认为这个问题的主题严格地说是关于组合使用GROUP BY,以及在哪里和为什么我没有得到我期望的结果

为了简化问题,现在的查询是:

$items = $db->query("SELECT 
                        count(transaction_items.id) as num_of_records,
                        item_code, 
                        usersid
                    FROM 
                        transaction_items
                    WHERE
                        charge_id = '12345'
                    GROUP
                    BY
                        usersid,
                        charge_id,
                        item_code
                        ");

我不太明白-这是你的意思吗

CREATE TABLE  transaction_items
(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
,charge_id  INT NOT NULL
,usersid  INT NOT NULL
,item_code INT NOT NULL
);

INSERT INTO transaction_items VALUES
(1  ,12345  ,12  ,66),
(2  ,12345  ,12  ,66),
(3  ,66666  ,11  ,66),
(4  ,12345  ,12  ,66),
(5 ,12345 , 6 ,22),
(6 ,77777 ,10 ,66),
(7 ,12345 ,12 ,66),
(8 ,44444 ,23 ,66),
(9 ,12345 , 6 ,22);

SELECT charge_id
     , usersid
     , item_code
     , COUNT(*) 
  FROM transaction_items 
 GROUP 
    BY charge_id
     , usersid
     , item_code;
+-----------+---------+-----------+----------+
| charge_id | usersid | item_code | COUNT(*) |
+-----------+---------+-----------+----------+
|     12345 |       6 |        22 |        2 |
|     12345 |      12 |        66 |        4 |
|     44444 |      23 |        66 |        1 |
|     66666 |      11 |        66 |        1 |
|     77777 |      10 |        66 |        1 |
+-----------+---------+-----------+----------+
编辑:我还是很困惑

SELECT charge_id
     , usersid
     , item_code
     , COUNT(*)
  FROM transaction_items
 WHERE charge_id = 12345
 GROUP
    BY charge_id
     , usersid
     , item_code;
+-----------+---------+-----------+----------+
| charge_id | usersid | item_code | COUNT(*) |
+-----------+---------+-----------+----------+
|     12345 |       6 |        22 |        2 |
|     12345 |      12 |        66 |        4 |
+-----------+---------+-----------+----------+

我觉得您更新后的查询很好,但我不确定“支付金额”列和“有效天数”列是否属于您的示例中列出的组的一部分。。这些是其他聚合函数吗

你确定你的数据与你期望的一样吗。。经营

SELECT * FROM transaction_items WHERE charge_id = :charge_id 
确保您有多个单独的组。你确定没有遗漏一些数据吗

另外,您是按courseid而不是item_代码分组的,对吗

更新后:

这更有意义,但您的示例查询现在应该可以工作了

我希望您有一些连接,可能是一个左连接,它返回null,而您需要一个id,因此所有null都被分组在一起


尝试一点一点地分解查询,确保所有单独的部分都按预期工作。

transaction\u items.*不是一个好主意。列出您的字段名。没错,WHERE子句将其限制为返回一条记录,但如果没有WHERE charge\u id=:charge,我将从transaction\u items表中获取每条记录-如何将其筛选为特定的charge\u id值?我现在已经列出了交易项目。*单独列出,我不知道为什么我一开始没有列出。你的思路是对的,但你在那里发布的内容是我已经拥有的。看看上面的表,您会在查询中添加什么来只获取charge_id='12345'的行,因为where子句只获取一行,所有行的总计数都是它的组合。如果没有WHERE子句,我将获得所有行。通过编辑,我的输出将是charge\u id=12345,usersid=6,COUNT*=6。它似乎只检索第一行数据和所有行的计数。charge_id=12345来自where子句。usersid=6我不知道它为什么瞄准一条记录,也许它选择了第一条?而“COUNT*=6”是因为单个记录返回的是带有WHERE子句charge_id->的所有记录的总计数,即使是它没有返回的记录(即上面表中的2+4)也返回到6,只有一条记录。但这似乎是您想要的!?!?!一点也不,我要的正是您在编辑中发布的内容,即两个单独的行,返回每个唯一usersid/item_代码对匹配的记录。现在,我只返回一行,所有行都有一个计数值。让我构建一个SQLFIDDLE。是的,我应该强调,我的示例已经大大简化,以“解构”这个问题,尽管我认为现在可能会导致相反的结果。让我做一些编辑来清理云层。谢谢这里的更新和帮助。不幸的是,我已经将查询剥离了,您可以看到的是我目前正在测试的内容。我是bu
拉小提琴now@Arbiter,这个查询很好,你的数据一定是朗姆酒。是的,SQL FIDDLE证实了这一点——这让我发疯。我现在得睡觉了,6小时后我会回来的。为调查这件事干杯!现在,如果一开始就提供或要求一把小提琴的话-
SELECT * FROM transaction_items WHERE charge_id = :charge_id