2012-07-12 5 views
0

У меня есть эти два запроса:MySQL - Получить события и присоединяется в одном запросе

SELECT `a`.*, `b`.`id` AS host_id, SUM(CASE WHEN c.event_id IS NOT NULL THEN 1 ELSE 0 END) AS count_joins, SUM(CASE WHEN c.event_id IS NOT NULL AND c.user_id = 0 THEN 1 ELSE 0 END) AS joined 
FROM (`events` AS a) 
INNER JOIN `users` AS b ON `b`.`id` = `a`.`host_id` 
LEFT JOIN `joins` AS c ON `c`.`event_id` = `a`.`id` 
WHERE `a`.`date` > '2012-07-12 11:51:34' 
GROUP BY `a`.`id` 
ORDER BY `a`.`date` ASC 
LIMIT 20 

и

SELECT `b`.`id`, `b`.`first_name`, `b`.`last_name`, `b`.`email`, `b`.`username`, `b`.`thumbnail` 
FROM (`joins` AS a) 
INNER JOIN `users` AS b ON `b`.`id` = `a`.`user_id` 
WHERE `a`.`event_id` = '1' 
AND `a`.`user_id` != 0 
ORDER BY RAND() 
LIMIT 8 

Первый получить все события, а затем, используя цикл Еогеасп, я получаю объединение каждого события со вторым запросом.

Мой вопрос: как я могу сделать все это с помощью одного запроса?

Вот моя схема:

schema

Я хотел бы вернуться многомерный массив, например:

Array 
(
    [0] => Array 
     (
      [id] => 1 
      [title] => Title 
      [description] => DescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescriptionDescription 
      [segment] => title 
      [thumbnail] => 356a192b7913b04c54574d18c28d46e6395428ab.jpeg 
      [cover] => 356a192b7913b04c54574d18c28d46e6395428ab.jpeg 
      [locale] => Locale 
      [address] => Rua Afonso Pena, 22, Tijuca 
      [list] => 0 
      [date] => 2013-10-10 10:10:10 
      [created] => 
      [host_id] => 1 
      [count_joins] => 5 
      [joined] => 0 
      [joins] => Array 
       (
        [0] => Array 
         (
          [id] => 4 
          [first_name] => Giovanna 
          [last_name] => Carneiro 
          [email] => [email protected] 
          [username] => gigi 
          [thumbnail] => 1b6453892473a467d07372d45eb05abc2031647a.jpg 
         ) 

        [1] => Array 
         (
          [id] => 5 
          [first_name] => Júlio 
          [last_name] => César 
          [email] => [email protected] 
          [username] => jujuba 
          [thumbnail] => ac3478d69a3c81fa62e60f5c3696165a4e5e6ac4.jpg 
         ) 

        [2] => Array 
         (
          [id] => 3 
          [first_name] => Claudio 
          [last_name] => Cardozo 
          [email] => [email protected] 
          [username] => cazo 
          [thumbnail] => 77de68daecd823babbb58edb1c8e14d7106e83bb.jpg 
         ) 

        [3] => Array 
         (
          [id] => 1 
          [first_name] => Claudius 
          [last_name] => Ibn 
          [email] => [email protected] 
          [username] => ibnclaudius 
          [thumbnail] => 356a192b7913b04c54574d18c28d46e6395428ab.jpeg 
         ) 

        [4] => Array 
         (
          [id] => 2 
          [first_name] => Elza 
          [last_name] => Virginia 
          [email] => [email protected] 
          [username] => elzavirginia 
          [thumbnail] => da4b9237bacccdf19c0760cab7aec4a8359010b0.jpg 
         ) 

       ) 

     ) 

    [1] => Array 
     (
      [id] => 2 
      [title] => Another Title 
      [description] => Description 
      [segment] => another-title 
      [thumbnail] => da4b9237bacccdf19c0760cab7aec4a8359010b0.jpeg 
      [cover] => da4b9237bacccdf19c0760cab7aec4a8359010b0.jpeg 
      [locale] => Locale 
      [address] => Travessa Nestor Vitor, 117, Tijuca 
      [list] => 0 
      [date] => 2013-10-10 10:10:10 
      [created] => 
      [host_id] => 3 
      [count_joins] => 5 
      [joined] => 0 
      [joins] => Array 
       (
        [0] => Array 
         (
          [id] => 1 
          [first_name] => Claudius 
          [last_name] => Ibn 
          [email] => [email protected] 
          [username] => ibnclaudius 
          [thumbnail] => 356a192b7913b04c54574d18c28d46e6395428ab.jpeg 
         ) 

        [1] => Array 
         (
          [id] => 4 
          [first_name] => Giovanna 
          [last_name] => Carneiro 
          [email] => [email protected] 
          [username] => gigi 
          [thumbnail] => 1b6453892473a467d07372d45eb05abc2031647a.jpg 
         ) 

        [2] => Array 
         (
          [id] => 3 
          [first_name] => Claudio 
          [last_name] => Cardozo 
          [email] => [email protected] 
          [username] => cazo 
          [thumbnail] => 77de68daecd823babbb58edb1c8e14d7106e83bb.jpg 
         ) 

        [3] => Array 
         (
          [id] => 5 
          [first_name] => Júlio 
          [last_name] => César 
          [email] => [email protected] 
          [username] => jujuba 
          [thumbnail] => ac3478d69a3c81fa62e60f5c3696165a4e5e6ac4.jpg 
         ) 

        [4] => Array 
         (
          [id] => 2 
          [first_name] => Elza 
          [last_name] => Virginia 
          [email] => [email protected] 
          [username] => elzavirginia 
          [thumbnail] => da4b9237bacccdf19c0760cab7aec4a8359010b0.jpg 
         ) 

       ) 

     ) 

) 

Первый запрос возвращает события, второй присоединяется. Я хотел бы вернуть все, если возможно, только с ОДНОМ запросом.

+0

Это много информации. Это облегчило бы жизнь, если бы вы также опубликовали схему, некоторые данные и то, что вы хотели бы получить. –

+0

Я отредактировал мое первое сообщение, проверьте его! –

ответ

0

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

Если вы используете ORM, такие как linq или Hibernate, вся работа идет в фоновом режиме.

Вы можете получить результат, как:

events.id | events.title | events.locale | users.id | users.first_name | users.last_name

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

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

+0

Вот что я упрямый! Благодаря! –

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