group_concat много раз? - PullRequest
       12

group_concat много раз?

2 голосов
/ 14 сентября 2011

Я пытаюсь сделать запрос MySQL, который использует другой group_concat с данными из того же LEFT JOIN. Пример таблицы может быть:

Стол машин кариде | license_plate

Таблица шин (означает использованные шины) кариде | модель | ширина

Из этих таблиц я хочу получить список моделей шин, классифицированных по их ширине, с той идеей, что есть только две возможные ширины, и я загружаю его со страницы автомобильной карты.

 SELECT name, 
 if(width=205,group_concat(model ORDER BY model ASC),'') as width_205,
 if(width=225,group_concat(model ORDER BY model ASC),'') as width_225,
 FROM cars
 LEFT  JOIN tires ON cars.carid=tires.carid
 WHERE carid='10'

Я надеюсь, что мое объяснение понятно. Это предложение не работает должным образом, и я не знаю, из-за ли это плохого синтаксиса или просто не могу использовать group_concat таким образом.

Хорошо, спасибо за чтение, и я буду ждать ваших ответов. Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 15 сентября 2011

Оба решения великолепны! Может быть, вторая более элегантная и, наконец, я буду ее использовать, но я приму к сведению и первую, поскольку она более конкретна и может быть лучше для некоторых ситуаций.

Чтобы первый метод работал, мне пришлось удалить «CASE AS model» после «END», чтобы предотвратить ошибки MySQL:

ВЫБРАТЬ имя, GROUP_CONCAT (ширина корпуса, когда 205, затем модель ELSE NULL END ORDER BY модель) как ширина_205, GROUP_CONCAT (ширина корпуса, когда 225, затем модель ELSE NULL END ORDER BY модель) как ширина_225, ОТ автомобилей ШИНЫ СЛЕДУЮЩЕГО СОЕДИНЕНИЯ НА cars.carid = tyres.carid ГДЕ carid = '10 ' GROUP BY name

Я также добавил DISTINCT перед CASE внутри group_concat, чтобы избежать повторений.

Для второго метода я добавил «ORDER BY width ASC» только в конце предложения. Для любого другого, кто может нуждаться в этом методе, не забывайте, что mysql_fetch_ (что угодно) уже получает первый результат, который содержит первый случай group_concat.

Большое спасибо! CU

0 голосов
/ 14 сентября 2011

Попробуйте

SELECT name, 
  GROUP_CONCAT(CASE width WHEN 205 THEN model ELSE NULL END CASE AS model ORDER BY model) as width_205,
  GROUP_CONCAT(CASE width WHEN 225 THEN model ELSE NULL END CASE AS model ORDER BY model) as width_225,
FROM cars
LEFT  JOIN tires ON cars.carid=tires.carid
WHERE carid='10'
GROUP BY name

чтобы получить то, что вы хотите. У меня нет MySQL под рукой, чтобы проверить. Возможно, вам придется обмануть (или даже отказаться) от внутреннего ORDER BY.

В качестве альтернативы, вы можете получить две строки назад (и вам не придется менять ваш SQL, если будет добавлен третий размер) с помощью:

SELECT name, width, GROUP_CONCAT(model ORDER BY model) AS Models
FROM cars
LEFT  JOIN tires ON cars.carid=tires.carid
WHERE carid='10'
GROUP BY name, width
...