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



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



我真的很难计数和分组SQL。

重要的表格是transaction_items-如果某人以每辆100磅的价格购买了4辆同一辆自行车,则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'
        )
)


所以我想得到一个数组:


将具有相同charge_id,usersid和item_code的所有记录分组
以有用的格式取回数据,并带有计数(就像数量一样)
计数(数量)应仅针对每个组,而不是所有记录


我现在得到的似乎只是一个产品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子句。当我删除它时,查询可以正常运行,但是可以从项目表中收集所有记录,而我只希望那些在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
                        ");

最佳答案

不确定我是否遵循-这是您的意思吗?

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


!?!?!

关于mysql - SQL GROUP BY(多个组),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25149276/

10-14 00:38