MySQL 自连接或替代中的子查询?
MySQL subquery within self join or alternative?
我正在尝试为我们的奖学金筹款俱乐部查询,该俱乐部 return 是晚宴活动的所有门票销售,并指示每个购买门票的成员是否正在支付她的会费(在过去 365 天内支付)。这将用于登录 sheet,表明已经购买了多少张门票,以及我们是否需要要求他们续订会员资格、更新他们的联系信息等。我可以 return门票销售或活跃会员资格,但我不知道如何将这两个查询合并到一个查询中,这样我就不必使用 PHP 数组。希望有人能帮忙:
/* 以下是相关 table 的摘录 */
+----------+ +--------------------+ +--------------------------+
| members | | store_transactions | | store_product_categories |
+----------+ +--------------------+ +--------------------------+
| id | | id | | id |
| last | | invoice | | category |
| first | | memberID | | officeID |
| spouse | | categoryID | | modified |
| lifetime | | productID | +--------------------------+
| email | | name |
| phone | | price | +-------------+
| created | | quantity | | pmt_methods |
+----------+ | addedBy | +-------------+
| pmtMethod | | id |
| created | | method |
+--------------------+ +-------------+
/* 第一个查询 return 添加了所有 Muster 门票销售 w/whom(通过网站自动交易或通过俱乐部官员手动交易)和 pmt 方法(仅限 RSVP、现金等)* /
SELECT member.last, member.first, member.spouse,
member.email, member.phone,
SUM(transaction.quantity) dinnerTix,
SUM(transaction.price * transaction.quantity) total,
IF (addedBy = '0' OR addedBy IS NULL, 'Website',
CONCAT_WS(' ', officer.first, officer.last))
AS addedBy, method
FROM store_transactions AS transaction
LEFT JOIN members AS member ON transaction.memberID = member.id
LEFT JOIN store_product_categories ON transaction.categoryID =
store_product_categories.id
LEFT JOIN pmt_methods ON transaction.pmtMethod = pmt_methods.id
LEFT JOIN members officer ON officer.id = addedBy
WHERE categoryID = '2'
AND year(transaction.created) = '2015'
AND (name LIKE '%member%')
GROUP BY CONCAT(member.last, '_', member.first)
ORDER BY member.last, member.first;
第一个查询 return 是这样的:
+------+-------+--------+-------------+--------------+---
| last | first | spouse | email | phone |
+------+-------+--------+-------------+--------------+---
| Doe | John | Jane | abc@abc.com | 123-456-7890 |
+------+-------+--------+-------------+--------------+---
---+-----------+--------+-----------+--------+
| dinnerTix | total | addedBy | method |
---+-----------+--------+-----------+--------+
| 5 | 150.00 | President | cash |
---+-----------+--------+-----------+--------+
/* 第二个查询 return 所有活跃会员,将最后一次会员购买增加 1 年以显示年度会员到期 */
SELECT last, first,
DATE_FORMAT(ADDDATE(store_transactions.created, INTERVAL 1 YEAR),
'%M %e, %Y') AS expires
FROM store_transactions
LEFT JOIN members ON store_transactions.memberID = members.id
WHERE store_transactions.created >= SUBDATE(CURDATE(), INTERVAL 1
YEAR) AND categoryID = 1 OR lifetime = 'Y'
GROUP BY members.id
ORDER BY members.last, members.first;
第二个查询return是这样的:
+------+-------+-------------+
| last | first | expires |
+------+-------+-------------+
| Doe | John | May 3, 2015 |
+------+-------+-------------+
我认为合并两个查询会很简单,因此在第二个查询中 returned 的到期日期将附加到第一个查询结果的每一行。不幸的是,我在这里追尾,所以任何帮助将不胜感激!这是我第一次涉足自连接和 table 别名,所以我试图在不破坏过去 8 年平稳运行的网站的情况下扩大我的视野!谢谢!!
应该很容易。假设 Q1
= 您的第一个查询,Q2
= 您的第二个查询。它应该像这样简单:
select q1.*, q2.expires
from (Q1) q1
inner join (Q2) q2
on q1.last = q2.last and q1.first = q2.first
只需将您的第一个查询复制并粘贴到 Q1
所在的括号内,然后将您的第二个查询复制并粘贴到 Q2
中
当然,如果有两个同名的人,这将中断,在这种情况下,您最好在两个查询中都包含 id
字段,然后加入该字段。
我正在尝试为我们的奖学金筹款俱乐部查询,该俱乐部 return 是晚宴活动的所有门票销售,并指示每个购买门票的成员是否正在支付她的会费(在过去 365 天内支付)。这将用于登录 sheet,表明已经购买了多少张门票,以及我们是否需要要求他们续订会员资格、更新他们的联系信息等。我可以 return门票销售或活跃会员资格,但我不知道如何将这两个查询合并到一个查询中,这样我就不必使用 PHP 数组。希望有人能帮忙:
/* 以下是相关 table 的摘录 */
+----------+ +--------------------+ +--------------------------+
| members | | store_transactions | | store_product_categories |
+----------+ +--------------------+ +--------------------------+
| id | | id | | id |
| last | | invoice | | category |
| first | | memberID | | officeID |
| spouse | | categoryID | | modified |
| lifetime | | productID | +--------------------------+
| email | | name |
| phone | | price | +-------------+
| created | | quantity | | pmt_methods |
+----------+ | addedBy | +-------------+
| pmtMethod | | id |
| created | | method |
+--------------------+ +-------------+
/* 第一个查询 return 添加了所有 Muster 门票销售 w/whom(通过网站自动交易或通过俱乐部官员手动交易)和 pmt 方法(仅限 RSVP、现金等)* /
SELECT member.last, member.first, member.spouse,
member.email, member.phone,
SUM(transaction.quantity) dinnerTix,
SUM(transaction.price * transaction.quantity) total,
IF (addedBy = '0' OR addedBy IS NULL, 'Website',
CONCAT_WS(' ', officer.first, officer.last))
AS addedBy, method
FROM store_transactions AS transaction
LEFT JOIN members AS member ON transaction.memberID = member.id
LEFT JOIN store_product_categories ON transaction.categoryID =
store_product_categories.id
LEFT JOIN pmt_methods ON transaction.pmtMethod = pmt_methods.id
LEFT JOIN members officer ON officer.id = addedBy
WHERE categoryID = '2'
AND year(transaction.created) = '2015'
AND (name LIKE '%member%')
GROUP BY CONCAT(member.last, '_', member.first)
ORDER BY member.last, member.first;
第一个查询 return 是这样的:
+------+-------+--------+-------------+--------------+---
| last | first | spouse | email | phone |
+------+-------+--------+-------------+--------------+---
| Doe | John | Jane | abc@abc.com | 123-456-7890 |
+------+-------+--------+-------------+--------------+---
---+-----------+--------+-----------+--------+
| dinnerTix | total | addedBy | method |
---+-----------+--------+-----------+--------+
| 5 | 150.00 | President | cash |
---+-----------+--------+-----------+--------+
/* 第二个查询 return 所有活跃会员,将最后一次会员购买增加 1 年以显示年度会员到期 */
SELECT last, first,
DATE_FORMAT(ADDDATE(store_transactions.created, INTERVAL 1 YEAR),
'%M %e, %Y') AS expires
FROM store_transactions
LEFT JOIN members ON store_transactions.memberID = members.id
WHERE store_transactions.created >= SUBDATE(CURDATE(), INTERVAL 1
YEAR) AND categoryID = 1 OR lifetime = 'Y'
GROUP BY members.id
ORDER BY members.last, members.first;
第二个查询return是这样的:
+------+-------+-------------+
| last | first | expires |
+------+-------+-------------+
| Doe | John | May 3, 2015 |
+------+-------+-------------+
我认为合并两个查询会很简单,因此在第二个查询中 returned 的到期日期将附加到第一个查询结果的每一行。不幸的是,我在这里追尾,所以任何帮助将不胜感激!这是我第一次涉足自连接和 table 别名,所以我试图在不破坏过去 8 年平稳运行的网站的情况下扩大我的视野!谢谢!!
应该很容易。假设 Q1
= 您的第一个查询,Q2
= 您的第二个查询。它应该像这样简单:
select q1.*, q2.expires
from (Q1) q1
inner join (Q2) q2
on q1.last = q2.last and q1.first = q2.first
只需将您的第一个查询复制并粘贴到 Q1
所在的括号内,然后将您的第二个查询复制并粘贴到 Q2
当然,如果有两个同名的人,这将中断,在这种情况下,您最好在两个查询中都包含 id
字段,然后加入该字段。