SQL GROUP BY(多个组)

时间:2014-08-05 22:18:56

标签: mysql sql group-by grouping

编辑:似乎在sqlfiddle中工作...必须是在其他地方发生的错误。谢谢你们。


http://sqlfiddle.com/#!2/f867c/1


我真的坚持在SQL中进行计数和分组。

重要的表格是transaction_items - 如果有人购买同一辆自行车中的4辆,每件100英镑,那么transaction_items中有四行插入,每个数量一行(这已经完成)出于某种原因,我不想要quantity列。

我需要做的是从transaction_items获取所有charge_id = '12345'的记录,然后按transaction_items.usersidtransaction_items.item_code对它们进行分组 - 最终给我一个群组列表,每个小组都与独特的用户和独特的产品有关。因此,如果购物车中有多个产品,则用户可以拥有多个组。如果用户1购买了2 x项目1和4 x项目2,则用户1将有两个组,一个用于项目1,用于计数2,一个用于项目2,用于计数4.此时,我似乎只能得到一个小组。

所以如果我在transaction_items中有这个:

|  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 AND usersid AND item_code对数据进行分组我想要获取此数据:

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'          
        )
)

所以我希望得到一个阵列:

  1. 对具有相同charge_id,用户ID和item_code的所有记录进行分组
  2. 以可用的格式获取数据,并带有计数(就像数量一样)
  3. 只应对每个组进行计数(数量),而不是所有记录
  4. 我现在得到的似乎只是一个产品ID,只有一个用户ID,但反映所有用户和项目的记录总数,与我瞄准的目标正好相反! (下面的虚拟输出反映了上面示例表的使用):

    Array
    (
        [0] => Array
            (
                [charge_id] => '12345'
                [usersid] => '12'
                [item_code] => '66'
                [num_of_records] => '6'          
            )
    )
    

    我的询问:

    $items = $db->query("
                    SELECT 
                        count(transaction_items.id) as num_of_records,
                        transaction_items.*
                    FROM 
                        transaction_items 
                    WHERE
                        transaction_items.charge_id = :charge
                    AND
                        transaction_items.lmsid = :lmsid
                    GROUP
                    BY
                        transaction_items.usersid,
                        transaction_items.charge_id,
                        transaction_items");
    

    我错过了什么?

    谢谢!


    编辑&更新

    这完全取决于WHERE子句。当我删除它时,查询工作正常,但从items表中收集所有记录,而我只想要charge_id = '12345'的那些记录。因此,我认为这个问题的主题严格地与GROUP BY和WHERE的组合使用以及为什么我没有得到我期待的结果。

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

    $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
                            ");
    

2 个答案:

答案 0 :(得分:0)

不确定我效仿 - 这就是你的意思吗?

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 |
+-----------+---------+-----------+----------+

!?!?!

答案 1 :(得分:0)

我更新的查询对我来说很好,但我不确定列amount_paidvalid_days它们不属于GROUP BY或列在任何列中您的示例..是这些其他聚合函数吗?

您确定您的数据符合您的预期吗?运行

SELECT * FROM transaction_items WHERE charge_id = :charge_id 

确保您有多个单独的组。你确定你没有遗漏一些数据吗?

此外,您GROUP BY courseid代替item_code,这是正确的吗?

更新后:

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

我希望您有一些JOIN,可能是LEFT JOIN,而null正在返回null您希望获得ID的所有{{1}}将它们组合在一起。

尝试并逐位分解您的查询,并确保所有单独的部分都按预期工作。