在使用MySQL的PHP中我试图编写查询以使用连接表来提取某些必需的报告。我已阅读了很多SQL脚本手册,并且通常会通过将db表中的过滤记录拉入PHP来执行此类操作,并在那里做数学体操。不幸的是,这是低效的,所以我正在寻找正确的SQL查询,以指出我正确的方向。这是我的情况。
我有mysql表:事件和付款,它们由一个ID列链接(events.event_id = payments.payment_event_id)
我需要获取一个只包含5个关联付款最多的事件的记录集。然后我想要一个包含这个原始事件详细信息数组的结果数组以及一个整数,这是他们的票据支付计数。
理想情况下,结果数组结构如下所示:
$result_events--
|0||0|payment count(53)
|0||1|$full event array
|1||0|Payment Count (34)
|1||1|$full event array
编辑:
在与人交谈之后,我想我会说出我追求的是什么。我需要一个2列结果集,左列是event_id(来自事件表),右列是该事件的总付款金额(即与此事件ID匹配的'付款行数。所以随意的事件和付款随机表,我想留下这样的一个:
| Event_id | total Payments |
但按付款栏排序。我知道我在问地球:)
答案 0 :(得分:1)
如果您想获得一个事件的5个最常见的付款并获得这5个详细信息,您可以执行子查询以获取您对payment_event_ids进行分组的event_ids,然后将计数从上到下排序并排在最前面5结果。
然后您获取这些ID并获取与这些ID匹配的事件详细信息
SELECT
*
FROM
events
WHERE
event_id IN (
SELECT
payment_event_id
FROM
payments
GROUP BY payment_event_id
ORDER BY count(*) DESC
LIMIT 5
);
或者,您也可以通过加入获取所有付款详细信息,但这样返回的行数超过5行
SELECT
*
FROM
events
JOIN
payments
ON
events.event_id = payments.payment_event_id
WHERE
events.event_id IN (
SELECT
payment_event_id
FROM
payments
GROUP BY payment_event_id
ORDER BY count(*) DESC
LIMIT 5
);
答案 1 :(得分:0)
简单查询,只剩下你要做的就是从两个表中选择你需要的列名:
$q = "SELECT events.columname, payments.columnname FROM events
INNER JOIN payments ON events.event_id = payments.payment_event_id
ORDER BY payments.payment_count DESC
LIMIT 5";