2015-04-23 3 views
0

Я пытаюсь сформировать запрос для нашего клуба по сбору стипендий, который возвращает все продажи билетов на ужин, а также указывает, является ли каждый член, который приобрел билеты, на свои сборы (выплачивается в течение последних 365 дней). Это будет использоваться для листа входа, который указывает, сколько билетов было куплено, и нужно ли нам попросить их обновить их членство, обновить их контактную информацию и т. Д. Я могу вернуть либо продажи билетов, либо активное членство, но я не может понять, как включить оба запроса в один запрос, поэтому мне не придется использовать массив PHP. Надеюсь, кто-то может помочь:Подзапрос MySQL в рамках самостоятельного присоединения или альтернативы?

/* Вот выдержки из соответствующих таблиц */

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

/* 1-запрос возвращает все продажи 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; 

1-запрос возвращает что-то вроде этого:

+------+-------+--------+-------------+--------------+--- 
| last | first | spouse | email  | phone  | 
+------+-------+--------+-------------+--------------+--- 
| Doe | John | Jane | [email protected] | 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; 

2-й запрос возвращает что-то вроде этого:

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

Я думал было бы просто объединить два запроса, чтобы дата истечения, возвращаемая во втором запросе, была добавлена ​​к каждой строке первого результата запроса. К сожалению, я преследую свой хвост здесь, поэтому любая помощь будет принята с благодарностью! Это был мой первый набег на самодостаточные и псевдонимы таблиц, поэтому я стараюсь расширить горизонты, не нарушая сайт, который работает гладко в течение последних 8 лет! Благодаря!!

ответ

1

Это должно быть легко. Давайте скажем 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 в обоих запросах, и присоединиться к этому.

+0

Я изменил свои запросы, чтобы вернуть идентификаторы обоих, чтобы избежать проблем с неповторимыми именами (у нас их довольно много на 785 членов) по вашей рекомендации. Спасибо! – psterling