簡體   English   中英

自我連接還是替代的MySQL子查詢?

[英]MySQL subquery within self join or alternative?

我正在嘗試對我們的獎學金籌款俱樂部進行查詢,該查詢將所有門票銷售返還給晚餐活動,並指出是否已購買門票的每個會員都使用她的會費(過去365天內支付)。 這將用於登錄表,該表指示已購買了多少張票證以及我們是否需要讓他們更新其會員資格,更新其聯系信息等。我可以退回票證銷售或有效的會員資格,但是我可以無法弄清楚如何將兩個查詢合並到一個查詢中,因此我不必使用PHP數組。 希望有人可以提供幫助:

/ *以下是相關表格的摘錄* /

+----------+  +--------------------+  +--------------------------+
| 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      |
              +--------------------+  +-------------+

/ *第一個查詢返回添加的所有Muster機票銷售(通過網站進行自動交易或通過俱樂部官員進行手動交易)和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;

第一個查詢返回如下內容:

+------+-------+--------+-------------+--------------+---
| last | first | spouse | email       | phone        |
+------+-------+--------+-------------+--------------+---
|  Doe | John  | Jane   | abc@abc.com | 123-456-7890 |
+------+-------+--------+-------------+--------------+---

---+-----------+--------+-----------+--------+
   | dinnerTix | total  | addedBy   | method |
---+-----------+--------+-----------+--------+
   |     5     | 150.00 | President | cash   |
---+-----------+--------+-----------+--------+

/ *此第二個查詢返回所有活動成員,在上一次會員購買時加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;

第二個查詢返回如下內容:

+------+-------+-------------+
| last | first | expires     |
+------+-------+-------------+
|  Doe | John  | May 3, 2015 |
+------+-------+-------------+

我認為合並兩個查詢將很簡單,因此第二個查詢中返回的到期日期將附加到第一個查詢結果的每一行。 不幸的是,我在這里追尾,所以任何幫助將不勝感激! 這是我第一次嘗試使用自聯接和表別名,因此我試圖在不破壞過去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字段,然后再加入。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM