2010-12-14 3 views
1

Прошу прощения за неоднозначное название - я не мог придумать объяснения поведению, которое я хочу, не приводя примеров. Кроме того, если это повторяющийся поток, укажите мне правильный, и я удалю его. Я не мог найти то, что хотел, потому что, как я сказал выше, трудно объяснить ...MySQL ПРИСОЕДИНЯЙТЕСЬ двумя таблицами

В любом случае, я хочу выбрать данные из двух таблиц. Один из них содержит кучу проектов, тогда как другой содержит несколько элементов контрольного списка для каждого проекта. У меня есть очень примитивный 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 так, что я могу получить информацию о поведении я хочу? Спасибо за любую помощь,

EDIT

Спасибо очень много 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 

Джеймс

+0

может опубликовать ваш текущий запрос? – DeaconDesperado

ответ

2

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

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

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

Примеры:

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

Спасибо. Не могли бы вы разместить какой-то пример вывода? – Bojangles

+0

@JamWaffes - Я отправил образец сценария вместе с выходом. – dcp

+0

Спасибо! Я могу заставить PHP выполнять разделение строк. В основном я искал способ сделать один запрос вместо 20, для каждой загрузки страницы. – Bojangles

0

я не знаю очень много о MySql, но это выполнимо в SQL Server, так что это может быть возможно в MYSQL также.

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

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

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

Смежные вопросы