我已经看到很多关于添加到多维数组但我无法弄清楚它们如何适用于我的情况。我试图最终得到一个大的多维数组。
我有一个从会员数据库的mysql查询编译的多维关联数组。我的所有数组都是使用while循环编译的。
Array(
[0] => Array ( [full_name] => Amy Smith [id] => 00111111 [member_ref] => 1 [type] => 1 )
[1] => Array ( [full_name] => Bob Smith [id] => 00222222 [member_ref] => 2 [type] => 0 )
[2] => Array ( [full_name] => Cam Smith [id] => 00333333 [member_ref] => 3 [type] => 2 )
)
这是从mysql_query
编译的SELECT full_name, id, member_ref, type
FROM members
ORDER BY full_name asc
然后我在另一张表中为已付费会员的人提供了[id]号码列表。这是由另一个组织提供的。这将成为[付费]密钥。
Array(
[0] => Array ( [id] => 00111111 )
[1] => Array ( [id] => 00333333 )
[2] => Array ( [id] => 00444444 )
)
来自查询:
SELECT * FROM paid
最后,一个表格会在指定的时间范围内计算成员的出勤率,作为[日志]键。
Array(
[0] => Array ( [member_ref] => 1 [COUNT(member_ref)] => 17 )
[1] => Array ( [member_ref] => 2 [COUNT(member_ref)] => 10 )
[2] => Array ( [member_ref] => 3 [COUNT(member_ref)] => 1 )
)
来自
SELECT member_ref, COUNT(member_ref)
FROM log
WHERE timestamp >= STR_TO_DATE('$from')
AND timestamp < STR_TO_DATE('$to')
GROUP BY member_ref
我最终想要的是:(注意Bob Smith没有付款)
Array(
[0] => Array ( [full_name] => Amy Smith [id] => 00111111 [member_ref] => 1 [type] => 1 [paid] => 00111111 [log] => 17)
[1] => Array ( [full_name] => Bob Smith [id] => 00222222 [member_ref] => 2 [type] => 0 [paid] => 0 [log] => 10)
[2] => Array ( [full_name] => Cam Smith [id] => 00333333 [member_ref] => 3 [type] => 2 [paid] => 00333333 [log] => 1)
)
然后我可以根据需要输出它,但是我可以通过任何键对数据进行排序。
我很乐意使用单个mysql查询来执行此操作,其中排序键是php $ var,但我无法弄清楚JOIN元素,这对我来说太复杂了。
谢谢
答案 0 :(得分:1)
我的mySQL有点生疏,但我认为这基本上就是你想要的。绝对可以在1个查询中
SELECT m.full_name, m.id, m.member_ref, m.type, COUNT(l.member_ref) log,
Case WHEN p.Id != null
THEN true
ELSE false paid
FROM members m
LEFT JOIN paid p
ON m.id = p.id
LEFT JOIN log l
ON m.member_ref = l.member_ref
WHERE l.timestamp >= STR_TO_DATE('$from')
AND l.timestamp < STR_TO_DATE('$to')
ORDER BY m.full_name asc
答案 1 :(得分:1)
根据NSjonas的回答:
SELECT m.full_name,
m.id,
m.member_ref,
m.type,
(p.id IS NOT NULL) paid,
COUNT(l.member_ref) log
FROM members m
LEFT JOIN paid p
ON m.id = p.id
LEFT JOIN log l
ON m.member_ref = l.member_ref
AND l.timestamp >= '$from'
AND l.timestamp < '$to'
GROUP BY m.full_name, m.id, m.member_ref, m.type, p.id
ORDER BY m.full_name ASC