2016-12-21 8 views
4

У меня есть некоторые проблемы со списком, который необходимо отобразить на странице.Удалить дублирующиеся элементы списка, полученные из базы данных

Это что отображается в данный момент на странице.

Студенты

  • Студент 3
    01-02-2016 с 08:30 до 14:30
  • Студенческого 1
    01-06-2016 с 10:30 до 15:30
  • Студент 1
    01-08-2016 с 05:30 до 16:30
  • Студент 3
    03-05-2016 с 08:30 до 10:30
  • Студент 2
    01-1-2016 от 13:30 до 18:30
  • Студент 1
    01-02-2016 с 16:30 до 20:30

Он должен выглядеть следующим образом:
Студенты

  • Студент 1
    01-02-2016 с 16:30 до 20:30
    01-06-2016 с 10:30 до 15:30
    01-08-2016 с 05:30 до 16:30

  • Student 2
    01-1-2016 от 13:30 до 18:30

  • Студент 3
    01-02-2016 с 08:30 до 14:30
    03-05-2016 с 08:30 до 10:30

Эта информация поступает из базы данных:

<div id="preferences"> 
    <h2>Leerlingen</h2> 
    <?php 
    $sql2 = "SELECT leerlingen.firstname, leerlingen.lastname, 
      voorkeuren.start, voorkeuren.end, voorkeuren.title FROM 
      leerlingen JOIN voorkeuren ON leerlingen.uid=voorkeuren.title"; 

    $result2 = $db->query($sql2); 

    while ($row = $result2->fetch_assoc()) { 

     ?> 
     <ul> 
      <li><h4><?= $row['firstname'] . " " . $row['lastname'];?></h4></li> 
      <?= "Van " . date('j-m-Y H:i', strtotime($row['start'])) . " tot " . date('H:i', strtotime($row['end'])) ?> 
     </ul> 

     <?php 
    } 
    ?> 
</div> 

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

+2

Почему бы вы используете группы по имени студента? – sAcH

+1

@sAcH - возможно, потому что OP все еще требует всех рекордеров, это просто форматирование отображения, которое необходимо изменить. –

+1

Примените предложение order by к вашему SQL-запросу; проверьте в цикле отображения и только имя дисплея студента, если он отличается от предыдущего имени студента –

ответ

1

Сначала создаем массив, а затем пройти через него и отображение HTML

$sql2 = "SELECT leerlingen.firstname, leerlingen.lastname, voorkeuren.start, voorkeuren.end, voorkeuren.title 
FROM leerlingen 
JOIN voorkeuren 
ON leerlingen.uid=voorkeuren.title group by leerlingen.firstname"; 

$studentArr = []; 

while ($row = $result2->fetch_assoc()) { 
    $studentName = $row['firstname'] . " " . $row['lastname']; 
    if(!array_key_exists($studentName,$studentArr)) 
     $studentArr[] = $studentName; 
    $studentArr[$studentName][] = $row['start']; 
    $studentArr[$studentName][] = $row['end']; 
} 

foreach($studentArr as $key => $val){ 
    //your html code here 
} 
+0

ORDER BY, а не GROUP BY. – Strawberry

+0

Почему бы не группе? –

+0

@sAcH спасибо, но еще нет. Когда я использую: '?> Для тестирования он показывает: Test Account Примечание: Преобразование массива в строку в C: \ xampp \ htdocs \ lansingerland \ instructionseurs \ irooster.php в строке 47 Array –

0

Если это в той же таблице и иметь первичный ключ, а затем попробуйте использовать следующий запрос: (для одной таблицы)

Обновлено:

SELECT CASE WHEN t.id = (SELECT t2.id 
FROM distance t2 WHERE t2.fromid = t.fromid 
GROUP BY t2.id LIMIT 1) 
THEN t.id 
ELSE '' END AS FromId, t.toid, t.id, t.distance 
FROM distance t 

Примечание: выше запрос возвращает только отдельные имена или идентификатор, и если он имеет несколько таблиц, тогда вы должны использовать JOIN. Вот и все. Сначала попробуйте использовать его в одной таблице.

Выход:

prevent_duplicate

+0

Возникает вопрос (по крайней мере частично) о mysql – Strawberry

+0

Обновлено @Strawberry для MySQL. –

+0

Это ужасно :-( – Strawberry