[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Помогите с запросом.
AntonioSK
Помогите, пожалуйста, разобраться с задачей.

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

   users

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


  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, чтобы получить
вид типа:

  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




Спустя 2 часа, 51 минута, 24 секунды (30.06.2011 - 04:13) olgatcpip написал(а):
AntonioSK
в твблице language id - это ид юзера?? (нас в институте учили давать осмысленные названия всему, ну да ладно)

так вот вопрос. тебе нужно
1 - написать запрос выбора пользователей с языками.
2 - показать как ты это сделал.

и тогда мы все увидем, что ты стараешься.

а пока могу только рассказатть как.

выбрать все записи из таблицы users.
В коде получить масив. Распечатать массив! посмотреть на него!
В цикле проходить по масиву и выполнять запрос поиска по таблице language, где id равен значению[id] из цикла. Получать результаты в цикле и выводить на экран.

print_r($value); тебе поможет.

Спустя 3 часа, 42 минуты, 27 секунд (30.06.2011 - 07:55) denis79513 написал(а):
Примерно так, только если будет 2 языка учить или знать будет писать так:
Learn: french
Learn: spanish

А не так:
Learn: french, spanish
Чтобы так писало еще нужно дописать, эт уже сам подумай как=)

<?php
$sql = "SELECT `id`, `name`, `country` FROM `users`'";
$res = mysql_query($sql);
while($row = mysql_fetch_object($res))
{
$id = $row -> id;
$name = $row -> name;
$country = $row -> country;
echo 'Name : '.$name.' <br> Country : '.$country.' <br> ';

$sql2 = "SELECT `type`, `language` FROM `language` WHERE `id`='".$id."'";
$res2 = mysql_query($sql2);
while($row = mysql_fetch_object($res2))
{
$type = $row -> type;
$language = $row -> language;
echo $type.' : '.$language.' <br> ';
}
;

}
?>

Спустя 5 минут, 44 секунды (30.06.2011 - 08:01) Michael написал(а):
Цитата (denis79513)
$sql2 = "SELECT `type`, `language` FROM `language` WHERE `id`=`".$id."`";

ошибка `id`=`".$id."`".

Спустя 3 минуты, 23 секунды (30.06.2011 - 08:05) denis79513 написал(а):
Цитата (Michael @ 30.06.2011 - 05:01)
Цитата (denis79513)
"SELECT `type`, `language` FROM `language` WHERE `id`=`"$id"`";

ошибка `id`=`".$id."`".

ммм, не нашел различий...

Спустя 4 минуты, 26 секунд (30.06.2011 - 08:09) Michael написал(а):
В таблице language, столбец language у тебя содержит дубли значений(языков). Их(языки) надо вынести в отдельную таблицу. То же самое относится к столбцу type.
Т.е. структура БД у тебя не нормализована как положено.

Цитата (denis79513)
ммм, не нашел различий...

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

Спустя 25 минут, 31 секунда (30.06.2011 - 08:35) denis79513 написал(а):
Цитата (Michael @ 30.06.2011 - 05:09)
В таблице language, столбец language у тебя содержит дубли значений(языков). Их(языки) надо вынести в отдельную таблицу. То же самое относится к столбцу type.
Т.е. структура БД у тебя не нормализована как положено.

Цитата (denis79513)
ммм, не нашел различий...

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

я уже код обновил

Спустя 4 минуты, 22 секунды (30.06.2011 - 08:39) Michael написал(а):
Корректно, надо писать так:
$sql2 = 'SELECT `type`, `language` FROM `language` WHERE `id`=' . (int)$id;

Спустя 2 минуты, 23 секунды (30.06.2011 - 08:41) linker написал(а):
Как-то примерно так
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
$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'];
}

Спустя 2 часа, 12 минут, 54 секунды (30.06.2011 - 10:54) AntonioSK написал(а):
denis79513, была такая мысль но, получается слишком много обращений к базе. Буду домысливать Learn: french, spanish.

to linker
$query = "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"
;

$portfolio = mysql_query($query, $con) or die(mysql_error());

$last_id = -1;
while($user = mysql_fetch_assoc($portfolio))
{
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'];
}


Выходит что-то типа:
Name: Paul
Country: UK
Name: Paul
Country: UK
Name: Paul
Country: UK
Name: John
Country: Germany
Name: John
Country: Germany


может я чего-то упустил? я в ООП не силен

Спустя 7 минут, 13 секунд (30.06.2011 - 11:01) Michael написал(а):
Цитата (AntonioSK)
может я чего-то упустил? я в ООП не силен

Заметно, и не только в нем, т.к. тут нет никакого ООП laugh.gif

Спустя 15 минут, 9 секунд (30.06.2011 - 11:17) AntonioSK написал(а):
Цитата (Michael @ 30.06.2011 - 08:01)
Цитата (AntonioSK)
может я чего-то упустил? я в ООП не силен

Заметно, и не только в нем, т.к. тут нет никакого ООП laugh.gif

Ну вот, спалился - совсем зеленый biggrin.gif

Спустя 58 минут, 52 секунды (30.06.2011 - 12:15) linker написал(а):
Мда, забыл кое-что
$query = "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"
;

$portfolio = mysql_query($query, $con) or die(mysql_error());

$last_id = -1;
while($user = mysql_fetch_assoc($portfolio))
{
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();
$last_id = $user['id'];
}
$types[$user['type']][] = $user['language'];
}
foreach($types as $type => $langs)
echo $type . ': ' . implode(', ', $langs) . '<br>';

Спустя 4 минуты, 48 секунд (30.06.2011 - 12:20) AntonioSK написал(а):
linker, огромное спасибо! Работает!
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.