Я только что открыл эту удивительно полезную функцию MySQL GROUP_CONCAT
. Он кажется настолько полезным и чрезмерно упрощающим для меня, что я действительно боюсь его использовать. В основном потому, что прошло довольно много времени с тех пор, как я начал заниматься веб-программированием, и я никогда его нигде не видел. Образец удивительного использования будет следующим:Причины не использовать GROUP_CONCAT?
Таблица clients
содержит клиентов (вы не говорите ...) одну строку на одного клиента с уникальными идентификаторами.
Таблица currencies
имеет 3 колонки client_id
, currency
и amount
.
Теперь, если я хотел бы получить пользователь 15-х name
от clients
стола и его остатки, со «старым» методом массива перезапись я должен сделать используйте следующий SQL
SELECT id, name, currency, amount
FROM clients LEFT JOIN currencies ON clients.id = client_id
WHERE clients.id = 15
Тогда в PHP I придется перебрать результирующего набора и сделать перезапись массив (который я действительно не большой поклонник, особенно в массивных наборов результатов), как
$result = array();
foreach($stmt->fetchAll() as $row){
$result[$row['id']]['name'] = $row['name'];
$result[$row['id']]['currencies'][$row['currency']] = $row['amount'];
}
Однако с недавно обнаруженной функции я могу использовать это
SELECT id, name, GROUP_CONCAT(currency) as currencies GROUP_CONCAT(amount) as amounts
FROM clients LEFT JOIN currencies ON clients.id = client_id
WHERE clients.id = 15
GROUP BY clients.id
Затем на вещах уровня приложений настолько удивительные и очень
$results = $stmt->fetchAll();
foreach($results as $k => $v){
$results[$k]['currencies'] = array_combine(explode(',', $v['currencies']), explode(',', $v['amounts']));
}
вопрос, который я хотел бы спросить, есть ли какие-либо недостатки использования этой функции в производительности или что-либо вообще, потому что мне это просто выглядит как чистая удивительность, и это заставляет меня думать, что люди должны часто не использовать ее довольно часто.
EDIT:
Я хочу спросить, в конце концов, какие другие варианты, кроме массива перезапись, чтобы в конечном итоге с многомерного массива из результирующего набора данных MySQL, потому что если я выбрать 15 столбцов, это действительно большой боль в шее, чтобы написать этого зверя.
это удобно, но это не универсально. Он имеет ограниченную длину в строке, которую он может вернуть, обычно по умолчанию 1024 символа. Если у вас есть «большой» набор данных, ваша упорядоченная строка может легко превышать 1024 символа, и она будет беззвучно усечена/повреждена. –
Все это описано здесь http://stackoverflow.com/questions/276927/can-i-concatenate-multiple-mysql-rows-into-one-field/276949#276949 –
Эта длина может быть настроена –