2016-01-06 5 views
0

В настоящее время я работаю над проектом для школы. У меня есть две таблицы SQL и одна таблица для подключения двух. В Таблице содержится человек, таблица 2 содержит карту. Таблица подключения содержит первичный ключ и 2 значения. По значению - первичный ключ человека, другой - первичный ключ автомобиля. Эта таблица соединяет людей с автомобилями. С этим я могу составить таблицу на PHP, в которой я могу видеть, кто имеет машину.PHP for loop on sql results

Это прекрасно работает, однако каждый человек, имеющий несколько автомобилей, показан не один раз. Так, например: у человека один автомобиль номер один и номер два. В таблице теперь отображается имя человека 2 раза, а за его именем - автомобиль. Я бы хотел, чтобы он показывал таблицу с именами людей только один раз, а затем один или несколько автомобилей за этим.

Ниже приведен пример того, как он у меня установлен сейчас:

$query = "SELECT firstname, lastname, car FROM people, cars, connecttabel   
WHERE connecttabel.personnumber = people.personnumer 
AND connecttabel.carnumber = cars.carnumber"; 
$result = mysqli_query($database, $query) 
or die ("error"); 
echo "<table>"; 
while($record=mysqli_fetch_array($result)) 
{$firstname = $record['firstname']; 

и так далее. С переменными я заполняю таблицу.

Кто-нибудь знает, как мне помочь здесь? Я думаю, что это должно быть сделано с циклом for, но я пробовал последние 3 часа, и я не могу сделать это.

+0

использовать группу по запросу в –

ответ

0
$query = "SELECT firstname, lastname, car FROM people, cars, connecttabel   
WHERE connecttabel.personnumber = people.personnumer 
AND connecttabel.carnumber = cars.carnumber Group by people.id"; 
$result = mysqli_query($database, $query) 
or die ("error"); 
echo "<table>"; 
while($record=mysqli_fetch_array($result)) 
{$firstname = $record['firstname']; 
+0

Не было, что требуется [GROUP_CONCAT()] (http://dev.mysql.com/ doc/refman/5.7/en/group-by-functions.html # function_group-concat) для извлечения всех данных (вплоть до предела буфера)? – VolkerK

1

Я предполагаю, что запрос возвращает что-то вроде:

| first_name | last_name | car | 
+------------------------------------------+ 
| John   | Doe   | Mustang | 
| John   | Doe   | Camaro | 
| John   | Doe   | SL55 | 
| Jane   | Deo   | Prius | 
| Jane   | Deo   | Renegade| 

Если вы хотите только количество автомобилей, каждый из которых есть, вы можете попробовать:

SELECT firstname, lastname, COUNT(car) FROM people, cars, connecttabel   
WHERE connecttabel.personnumber = people.personnumer 
AND connecttabel.carnumber = cars.carnumber GROUP BY firstname, lastname; 

Это даст вам:

| first_name | last_name |COUNT(car)| 
+-------------------------------------------+ 
| John   | Doe   | 3  | 
| Jane   | Deo   | 2  | 

Но если вы хотите что-то как ...

| first_name | last_name |  car_list  | 
---------------------------------------------------------+ 
| John   | Doe   | Mustang, Camaro, SL55 | 
| Jane   | Deo   | Renegade, Prius  | 

Вы можете использовать Group Concat:

SELECT firstname, lastname, GROUP_CONCAT(DISTINCT car ORDER BY car) AS car_list FROM people, cars, connecttabel   
WHERE connecttabel.personnumber = people.personnumer 
AND connecttabel.carnumber = cars.carnumber GROUP BY firstname, lastname 
+0

спасибо, @VolkerK. Я отредактировал ответ. –

+0

примечание стороны: при использовании group_concat() следите за значением [group_concat_max_len] (http://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_group_concat_max_len) и максимальный объем данных, ожидаемых для каждой группы. – VolkerK

+0

Это также так, я скопировал исходный запрос в свой буфер обмена и вклеил его снова. Извини за это. –