Есть 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); тебе поможет.
в твблице 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
Чтобы так писало еще нужно дописать, эт уже сам подумай как=)
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) | ||
ошибка `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. Т.е. структура БД у тебя не нормализована как положено.
Это я показал где ошибка. Разберись уже наконец с кавычками, только что показывал тебе как не надо. |
я уже код обновил
Спустя 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
Выходит что-то типа:
может я чего-то упустил? я в ООП не силен
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](http://phpforum.ru/html/emoticons/laugh.gif)
Спустя 15 минут, 9 секунд (30.06.2011 - 11:17) AntonioSK написал(а):
Цитата (Michael @ 30.06.2011 - 08:01) | ||
Заметно, и не только в нем, т.к. тут нет никакого ООП ![]() |
Ну вот, спалился - совсем зеленый
![biggrin.gif](http://phpforum.ru/html/emoticons/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, огромное спасибо! Работает!