我真的坚持在SQL中进行计数和分组。
重要的表格是transaction_items
- 如果有人购买同一辆自行车中的4辆,每件100英镑,那么transaction_items
中有四行插入,每个数量一行(这已经完成)出于某种原因,我不想要quantity
列。
我需要做的是从transaction_items
获取所有charge_id = '12345'
的记录,然后按transaction_items.usersid
和transaction_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'
)
)
所以我希望得到一个阵列:
我现在得到的似乎只是一个产品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
");
答案 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_paid
和valid_days
它们不属于GROUP BY
或列在任何列中您的示例..是这些其他聚合函数吗?
您确定您的数据符合您的预期吗?运行
SELECT * FROM transaction_items WHERE charge_id = :charge_id
确保您有多个单独的组。你确定你没有遗漏一些数据吗?
此外,您GROUP
BY
courseid
代替item_code
,这是正确的吗?
更新后:
这更有意义,但您的示例查询现在应该可以正常工作。
我希望您有一些JOIN
,可能是LEFT JOIN
,而null
正在返回null
您希望获得ID的所有{{1}}将它们组合在一起。
尝试并逐位分解您的查询,并确保所有单独的部分都按预期工作。