Помогите составить запрос к базе

AntonioS

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

Есть 2 таблицы:

PHP:
   users

  | id |  name  | country |  
  |----|--------|---------|  
  |  1 |  Paul  |   UK    |  
  |  2 |  John  | Germany |    
  |  3 |  Tom   | France  |    
  |  4 |  Fred  | Spain   |
PHP:
  language

  | id |   language  |  type   |  
  |----|-------------|---------|  
  |  1 |   english   |  speak  |
  |  1 |   french    |  learn  |
  |  1 |   spanish   |  learn  |
  |  2 |   german    |  speak  | 
  |  2 |   italian   |  learn  |
  |  3 |   french    |  speak  |
  |  3 |   english   |  speak  |
  |  3 |   russian   |  learn  |    
  |  4 |   spanish   |  speak  |  
  |  4 |   chinese   |  learn  |
Данные, соответствующие условиям поиска по параметрам, должны
выводиться при помощи шаблона в цикле. Не получается вывести пользователей
с несколькими языками. Как составить запрос mySQL, чтобы получить
вид типа:

PHP:
Name: Paul
  Country: UK
  Speak: english
  Learn: french, spanish

  Name: John
  Country: Germany
  Speak: german
  Learn: italian

  Name: Tom
  Country: France
  Speak: french, english
  Learn: russian

  Name: John
  Country: Spain
  Speak: spanish
  Learn: chinese
 

AntonioS

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

shelestov

я тут часто
И что? Обработайте в цикле уже с помощью php. Запрос к базе останется один.
Не надо пытаться все переложить на базу.
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Дамп прикрепи таблиц, забивать очень лениво) Подозреваю там нужен GROUP_CONCAT_WS и немного магии.
 

AntonioS

Новичок
Дамп прикрепи таблиц, забивать очень лениво) Подозреваю там нужен GROUP_CONCAT_WS и немного магии.
Мне их тоже забивать тогда придется :) Эта задача упрощенная версия того, что есть - что бы не забивать форум лишним мусором. Хочу понять в каком направлении
двигаться, опыта мало и многих вещей не знаю. Мне предлагают на другом форуме:

PHP:
SELECT 
   `users`.`id`
   `users`.`name`, 
   `users`.`country`,
   `language`.`language`,
   `language`.`type`
FROM 
   `users`
LEFT JOIN 
   `language` 
ON 
   `language`.`id` = `users`.`id`
ORDER BY
   `users`.`id` ASC, `language`.`type` DESC
PHP:
$last_id = -1;
while($user = mysql_fetch_assoc($resource))
{
    if ($last_id != $user['id'])
    {
        if ($last_id != -1)
        {
            foreach($types as $type => $langs)
                echo $type . ': ' . implode(', ', $langs) . '<br>';
            echo '<br>';
        }
        echo 'Name: ' . $user['name'] . '<br>';
        echo 'Country: ' . $user['country'] . '<br>';
        $types = array();
    }
    $types[$user['type']][] = $user['language'];
}
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Юзаем запрос вида:
Код:
select *, (SELECT GROUP_CONCAT(type, ':', lang) as type from t2 where t2.id=t1.id GROUP BY id) as type from t1 group by id;
Он вернет что-то вроде

Код:
+----+------+---------+------------------------------------------+
| id | name | country | type                                     |
+----+------+---------+------------------------------------------+
|  1 | Paul | UK      | speak:english,learn:french,learn:spanish |
|  2 | John | Germany | speak:german,Learn:italian               |
|  3 | Tom  | France  | speak:french,speak:english,learn:russian |
|  4 | Fred | Spain   | speak:spanish,learn:chineese             |
+----+------+---------+------------------------------------------+
Дальше парсим лапками ;)
 

shelestov

я тут часто
Юзаем запрос вида:
Код:
select *, (SELECT GROUP_CONCAT(type, ':', lang) as type from t2 where t2.id=t1.id GROUP BY id) as type from t1 group by id;
Он вернет что-то вроде

Код:
+----+------+---------+------------------------------------------+
| id | name | country | type                                     |
+----+------+---------+------------------------------------------+
|  1 | Paul | UK      | speak:english,learn:french,learn:spanish |
|  2 | John | Germany | speak:german,Learn:italian               |
|  3 | Tom  | France  | speak:french,speak:english,learn:russian |
|  4 | Fred | Spain   | speak:spanish,learn:chineese             |
+----+------+---------+------------------------------------------+
Дальше парсим лапками ;)
Особо большой разницы нет, если сделать запрос
select * from users join languages on users.id=languages.id
И после сформировать массив. Всего одна итерация по массиву получится.
 
Сверху