2015-03-19 2 views
2

Есть ли способ получить все строки, используемые в группе?Вернуть все строки в группе

Как и следовало ожидать, запрос ниже возвращает только одну строку за custref. Но если totalamount> 0, я хочу, чтобы он возвращал все строки в группе. Иначе нет.

$sql = "SELECT 
    debtors.custref, 
    debtors.amount, 
    users.bnkSort, 
    users.bnkAccNum, 
    users.bnkAccName, 
    SUM(debtors.amount) AS totalamount 
    FROM debtors 
    LEFT JOIN users ON debtors.custref=users.custref 
    WHERE 
    users.bank = 'Yes' 
    GROUP BY debtors.custref 
"; 
+2

Параметр 'Предложение GROUP BY' для выполнения функций над группами данных, если вам нужны строки в каждой группе, тогда вам нужно отправить другой запрос. Кстати, вы не должны 'SELECT' столбцы, которые не являются частью агрегации, потому что это приведет к неправильным результатам (хотя MySQL примет это). – watery

+0

Проверьте [group_concat()] (http://www.percona.com/blog/2013/10/22/the-power-of-mysqls-group_concat/), что позволит вам брать детали из определенного и соедините их в одно значение вместе с группировкой по значению (значениям). – DWright

ответ

1

Ваш запрос имеет несколько столбцов, которые признаны недействительными по group by - столбцов, которые не совпадают в строках в группе. Кроме того, предложение where отменяет left join. Таким образом, это в основном ваш запрос:

SELECT d.custref, SUM(d.amount) AS totalamount 
FROM debtors d JOIN 
    users u 
    ON d.custref = u.custref 
WHERE u.bank = 'Yes' 
GROUP BY d.custref; 

Чтобы получить все поля, вы можете использовать это в качестве подзапроса:

SELECT d.*, u.* 
FROM (SELECT d.custref, SUM(d.amount) AS totalamount 
     FROM debtors d JOIN 
      users u 
      ON d.custref = u.custref 
     WHERE u.bank = 'Yes' 
     GROUP BY d.custref 
     HAVING totalamount > 0 
    ) dc JOIN 
    debtors d 
    ON dc.custref = d.custref JOIN 
    users u 
WHERE u.bank = 'Yes'; 

ON dc.custref = u.custref 
Смежные вопросы