MySQL ПРИСОЕДИНЯЙТЕСЬ к двум таблицам - PullRequest
1 голос
/ 15 декабря 2010

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

В любом случае, я хочу выбрать данные из двух таблиц.Один содержит несколько проектов, а другой содержит несколько элементов контрольного списка для каждого проекта.У меня есть очень примитивный LEFT JOIN запрос в данный момент, который возвращает это (на данный момент есть только один проект):

name                    description
Project file symlinks   One
Project file symlinks   Two
Project file symlinks   seven
Project file symlinks   ahahahahaha
Project file symlinks   many
Project file symlinks   ANOTHER ONE

То, что я бы хотел бы , чтобы это произошлоэто для каждого проекта в таблице проектов:

name                    description
Project file symlinks   One
                        Two
                        seven
                        ahahahahaha
                        many
                        ANOTHER ONE

Или ноль, это не имеет значения.По сути, я хочу напечатать имя проекта только один раз, но распечатать все соответствующие элементы контрольного списка.

Вот запрос, который у меня сейчас есть:

SELECT Projects.name, DevProgress.description
FROM DevProgress
LEFT JOIN Projects
ON Projects.id = DevProgress.projectID

Может кто-нибудь предложить MySQL JOIN запрос, чтобы я мог получить поведение, которое я хочу?Спасибо за любую помощь,

РЕДАКТИРОВАТЬ

Большое спасибо dcp за помощь мне.В конце концов я пришел с этим LEFT JOIN запросом, опубликованным как ссылка:

SELECT name, GROUP_CONCAT(description) AS checklist 
FROM Projects LEFT JOIN DevProgress ON Projects.id = DevProgress.projectID 
GROUP BY name; 

И вывод:

name                      checklist
Project file symlinks     One,Two,seven,ahahahahaha,many,ANOTHER ONE
Testing Project numer 1   NULL

Джеймс

Ответы [ 2 ]

2 голосов
/ 15 декабря 2010

Вы можете использовать group_concat, чтобы собрать все описания для каждого проекта:

SELECT name,GROUP_CONCAT(description) FROM project GROUP BY name;

Таким образом, будет напечатано отдельное имя проекта, а также все описания этого проекта в одной строке, и каждое описание будет разделено запятой.

Пример:

create table project (name varchar(100), description varchar(100));

insert into project values ('Project file symlinks', 'One');
insert into project values ('Project file symlinks', 'Two');
insert into project values ('Project file symlinks', 'seven');
insert into project values ('Project file symlinks', 'ahahahahaha');
insert into project values ('Project file symlinks', 'many');
insert into project values ('Project file symlinks', 'ANOTHER ONE');

SELECT name,GROUP_CONCAT(description) FROM project GROUP BY name;    

Результаты:

name                       GROUP_CONCAT(description)
'Project file symlinks'    'One,Two,seven,ahahahahaha,many,ANOTHER ONE'
0 голосов
/ 15 декабря 2010

Я не очень много знаю о MySQL, но это возможно в SQL Server, поэтому это может быть возможно и в MySQL.

Но я хочу сказать, что, хотя это может быть выполнимо, это будет довольнонекрасиво, потому что SQL просто не разработан таким образом.В SQL каждая запись результирующего набора не зависит от других.Это имеет несколько преимуществ - например, вы можете применить дополнительный фильтр к набору результатов (если вы решите, что хотите только описания, начинающиеся с «ахахаха»), вы можете изменить его порядок (если вы хотите отсортировать по описанию), вы можете внутренне распараллелитьзапрос и т. д. без потери информации.

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

Таким образом, ваши лучшие варианты могут заключаться в том, чтобы либо работать с выводом, а затем обрабатывать его так, как вы хотите (что должно быть довольно тривиально - просто сохраняйте переменную с последним именем проекта)и замените имя пустой строкой, если оно совпадает с последней), или используйте ответ dcp и сведите группу в одну строку результатов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...