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 字段,然后加入该字段。