2014-11-21 4 views
-2

У меня есть 3 таблицы, из которых я хочу получить информацию.выберите данные с внутренними соединениями

Столы

tblStaff

идентификатор | имя

tblWork

идентификатор пользователя | неделя

tblOff

Идентификатор_пользователя | Неделя

Например, если у Михаэля есть значение или несколько значений в week или tblWork или tblOff, тогда я хочу вернуть эти значения.

UPDATE

Это один работает почти как я хочу. Кроме этого, если tblOff и tblWork выглядит следующим образом:

Майкл = 1 Идентификатор_пользователя

Dan = 2 Идентификатор_пользователя

tblWork

Идентификатор_пользователя, неделя

1 | 2014 v47

1 | 2014 v50

2 | 2014 V48

tblOff

Идентификатор_пользователя, неделя

1 | 2014 v48

1 | 2014 v49

2 | 2014 v52

Тогда я получаю только первый результат в обеих таблицах Майкла, я не получаю значения week.

SELECT tblStaff.name as name, tblWork.week as work_week, tblOff.week as off_week 
         FROM tblStaff 
         LEFT JOIN tblWork 
         ON tblStaff.id = tblWork.userid 
         LEFT JOIN tblOff 
         ON tblStaff.id = tblOff.userid 
         GROUP BY tblStaff.name 

SLOVED

Это то, что я сделал. После того, как я использую взорваться(), чтобы отделить значения, чтобы проверить их на текущий год + неделю

SELECT tblStaff.name as name, GROUP_CONCAT(DISTINCT tblWork.week) as work_week, GROUP_CONCAT(DISTINCT tblOff.week) as off_week 
         FROM tblStaff 
         LEFT JOIN tblWork 
          ON tblStaff.id = tblWork.userid 
         LEFT JOIN tblOff 
          ON tblStaff.id = tblOff.userid 
         GROUP BY tblStaff.name 
         ORDER BY tblStaff.name ASC 
+0

Вы можете предоставить образец того, что вы хотите увидеть и как выглядят ваши таблицы? –

+0

Я обновил вопрос. Как и сейчас, доза не перечисляет ничего. Нет ошибки, поэтому я должен задавать неправильный вопрос. – MrUnknown

+0

у вас есть два варианта, которые я могу придумать от верхней части головы для запроса. Вы можете группировать concat, который будет группировать все записи в определенном столбце, разделенные чем-то, что вы выбрали (например, блок HTML-кода, если хотите), который возвращает как один столбец для определенного значения группировки (например, имя, чтобы получить все значения одного имени). Или вы можете свернуть запрос, который является более сложным. –

ответ

0

Если tblWork.week столбец содержит значения, как 2014 v47 то результат

SELECT tblStaff.name as name, 
     GROUP_CONCAT(DISTINCT tblWork.week ORDER BY tblWork.week) as work_week 
etc 

будет что-то вроде этого ,

name  work_week 
Michael 2014 v47,2014 v48,2014 v50,2014 v51 
George  2014 v49,2014 v50,2014 v51 

GROUP_CONCAT создает строку с разделителями-запятыми в нем.

Если вы хотите

name  work_week 
Michael 2014 v47 | 2014 v48 | 2014 v50 | 2014 v51 

вам потребуется Ваша программа PHP не кажется, ожидает вид текстовой строки GROUP_CONCAT() генерирует

SELECT tblStaff.name as name, 
     GROUP_CONCAT(DISTINCT tblWork.week ORDER BY tblWork.week SEPARATOR ' | ') as work_week 

.

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

SELECT a.name, b.weeks as work_week, c.weeks as off_week 
    FROM tblStaff a 
    LEFT JOIN (
       SELECT userid, 
        GROUP_CONCAT(DISTINCT week 
            ORDER BY week 
            SEPARATOR ' | ') as weeks 
       FROM tblWork 
       GROUP BY userid    
      ) b ON a.id = b.userid 
    LEFT JOIN (
       SELECT userid, 
        GROUP_CONCAT(DISTINCT week 
            ORDER BY week 
            SEPARATOR ' | ') as weeks 
       FROM tblOff 
       GROUP BY userid    
      ) c ON a.id = c.userid 

Здесь показан скрипт SQL. http://sqlfiddle.com/#!2/f63e0/1/0

Необходимо выполнить операции GROUP BY по отдельности на tblWork и tblOff. Если вы присоединитесь к ним, а затем выполните GROUP BY, вы получите комбинаторный взрыв, который не годится.

+0

Спасибо, Олли, за помощь! Я пробовал это, но я не мог заставить его работать, затем я попытался переписать его, и я почти понял все, но не так. Я обновил вопрос своей попыткой. – MrUnknown

+0

Ooops, извините, я должен знать лучше, чем писать запрос такой же сложный, как без его попытки. Я отредактировал его. Вот оно, работает. http://sqlfiddle.com/#!2/f63e0/1/0 –

+0

Большое спасибо Олли !! Я не использовал именно этот код, так как увидел, что вы ответили после того, как я написал еще один, но вы толкнули меня в правильном направлении, спасибо большое! – MrUnknown