Goedemiddag,

Ik geraak er even niet meer uit (wellicht te lang bezig geweest :-) ). Ik heb de volgende query:

SELECT DISTINCT c.cus_id, c.firstname, c.lastname, c.credit, c.address, c.postal, c.city FROM customer_list AS c, transactions AS t WHERE t.transdate NOT BETWEEN DATE_SUB(DATE(NOW()), INTERVAL 18 MONTH) AND DATE(NOW()) AND t.to_customer != '1' AND t.from_customer = c.cus_id ORDER BY c.lastname ASC

De bedoeling is om de klantgegevens uit de database te halen die geen transacties hebben gehad in de periode van de 18 afgelopen maanden. Echter krijg ik ook de resultaten terug van klanten die wel transacties hebben gehad in de afgelopen maanden en transacties hebben gehad voor de 18 maanden.

Aangezien mijn SQL kennis niet al te groot is, zou ik het zo in PHP kunnen omschrijven:

<?php
$cus_query = mysql_query("SELECT cus_id, firstname, lastname, credit, address, postal, city FROM customer_list ORDER BY lastname ASC");
while ($cus_result = mysql_fetch_assoc($cus_query))
{
$trans_query = mysql_query("SELECT FROM transactions WHERE from_customer = '" .
$cus_result['cus_id'] .
"' AND transdate BETWEEN DATE_SUB(DATE(NOW()), INTERVAL 18 MONTH) AND DATE(NOW()) AND to_customer != '1'");
if (mysql_num_rows($trans_query) == 0)
{
echo '<tr>
<td>' . $cus_result['cus_id'] . '</td>
<td>' . $cus_result['firstname'] . '</td>
<td>' . $cus_result['lastname'] . '</td>
<td>' . $cus_result['address'] . '</td>
<td>' . $cus_result['postal'] . '</td>
<td>' . $cus_result['city'] . '</td>
<td>' . $cus_result['credit'] . '</td>
</tr>';
}
}
?>

Dit werkt ook, maar natuurlijk niet netjes en de performance op deze manier is ook niet al te best (> 100.000 transacties).

Kan iemand mij een schop in de goede richting geven om dit enkel met één SQL query af te kunnen?

B.V.D.

Niels.
Natuurlijk, makkelijk denken kan ook... Echter krijg ik bij beide query's evenveel rows terug (lijkt me zeer onwaarschijnlijk). Bij een LEFT JOIN blijft het denkwerk voor de database. Ik zal me deze week ook eens meer gaan verdiepen in JOIN.


SELECT c.cus_id, c.lastname, MAX(t.transdate) lasttrans
FROM
customer_list c
INNER JOIN
transactions t
ON t.from_customer = c.cus_id AND t.to_customer != 1 AND active = 'Y'
GROUP BY
c.cus_id, c.lastname
HAVING MAX(t.transdate) < CURRENT_DATE - INTERVAL 18 MONTH OR MAX(t.transdate) IS NULL



SELECT c.cus_id, c.lastname, MAX(t.transdate) lasttrans
FROM
customer_list c
INNER JOIN
transactions t
ON t.from_customer = c.cus_id AND t.to_customer != 1 AND active = 'Y'
GROUP BY
c.cus_id, c.lastname
HAVING MAX(t.transdate) < CURRENT_DATE - INTERVAL 18 MONTH

Reageren