2016-09-16 14 views
6

Używam następujące zapytanie SQL, aby wybrać wiersze z poprzez sprzężenie wewnętrzne posortowane według daty.Jak wykryć, czy data zmiany kwerendy wybierającej

SELECT * 
FROM  clubnights 
INNER  JOIN club ON clubnights.club = club.club_ID 
WHERE  visibility = 0 
AND  date >= CURDATE() 
ORDER BY clubnights.date ASC 

Następnie ładuję wszystkie dane w moim kodzie HTML za pomocą pętli PHP while.

Moim celem jest echo nagłówek HTML nad każdym odcinku danym dniu.

Dlatego szukam do wykrycia (albo za pośrednictwem PHP lub SQL), gdy zmiana daty jest wykrywany przez kwerendy wybierającej. Zasadniczo chcę porównać ostatnią kolumnę "date" z bieżącą, a jeśli się nie zgadzam, wykonam echo przez PHP.

Przykładem, zakładając, że są następujące wiersze:

2016-09-16 - Row 1 // Detect 'change' here as it's the first row 

2016-09-16 - Row 2 

2016-09-16 - Row 3 

2016-09-16 - Row 4 

2016-09-16 - Row 5 

2016-09-17 - Row 6 // Detect change here as date has changed 

2016-09-17 - Row 7 

2016-09-17 - Row 8 

Edycja: używam MySQL

+0

Które RDBMS używasz? –

+0

@GiorgosBetsos Używam MySQL. Powinienem o tym wspomnieć. –

+0

Jak zamawiasz w określonym terminie? –

Odpowiedz

2
SELECT *, 
     CASE WHEN @dd!=date THEN 1 ELSE 0 END as changed, 
     @dd:=date 
FROM  clubnights, (select @dd:=null) 
    INNER JOIN club ON clubnights.club = club.club_ID 
WHERE  visibility = 0 
AND  date >= CURDATE() 
ORDER BY clubnights.date ASC 

Można zdefiniować zmienną i zmienić go z rzędu do rzędu w porównaniu z aktualną datą

2

dobrze, zmienne lokalne mi być pomocne dla niego. Użyj poniższego sposobu!

Podczas wyświetlania danych w tabelach z pętli php użyć następującego algorytmu

* Jestem zakładając podłączeniu bazy danych.

<?php 
    $date2 = sortotime("today"); 
$q = mysql_query("select your_date_column_name as dt from your_table_name"); 
while($obj = mysql_fetch_object($q)) 
{ 
$date1 = $obj->dt; 
if(strtotime($date1) != strtotime($date2)) 
{ echo "Row Changed"; echo"<br/>"; $date2 = $date1; } 

echo $date1; 

Nadzieja to pomaga :)

+2

Funkcje mysql _ *() zostały wycofane wiele lat temu i zostały usunięte z wersji php v7. Pls nie sugerują żadnych rozwiązań wykorzystujących ten interfejs API. – Shadow

+0

Ok. Zajmę się tym w przyszłości. –

3

Gdybym zrozumieć swoje wymagania, a następnie do grupy rejestrów dzielących tę samą datę, zapis o najmniejszej club_ID jest pierwszy rekord w tej grupie. W poniższej odpowiedzi używam podkwerendy do znalezienia minimalnej wartości club_ID dla każdej daty. Podzapytanie jest następnie dołączane do pierwotnego zapytania w celu ustalenia, który rekord jest pierwszym, dla każdej daty.

SELECT clubnights.*, 
     club.*, 
     CASE WHEN t.club_ID IS NOT NULL THEN 'change' END AS date_changed 
FROM clubnights 
INNER JOIN club 
    ON clubnights.club = club.club_ID 
LEFT JOIN 
(
    SELECT MIN(club.club_ID) AS club_ID, 
      clubnights.date AS date 
    FROM clubnights 
    INNER JOIN club 
     ON clubnights.club = club.club_ID 
    GROUP BY clubnights.date 
) t 
    ON clubnights.date = t.date AND 
     club.club_ID = t.club_ID 

Zauważ, że wolę to rozwiązanie do obsługi problem w warstwie prezentacji PHP, MySQL, ponieważ został zaprojektowany do efektywnego przetwarzania danych, PHP znacznie mniej.

1

Można wybrać dane z mysql są uporządkowane według dat rosnącej, a następnie porównać je do kodu php, przykład:

$servername = "localhost"; 
$username = "username"; 
$password = "password"; 
$dbname = "myDB"; 

// Create connection 
$conn = new mysqli($servername, $username, $password, $dbname); 
// Check connection 
if ($conn->connect_error) { 
    die("Connection failed: " . $conn->connect_error); 
} 

$sql = "same as your query"; 
$result = $conn->query($sql); 
$previousDate = DateTime::createFromFormat('Y-m-d', '1990-01-01'); 
if ($result->num_rows > 0) { 
// output data of each row 
while($row = $result->fetch_assoc()) { 
$mysqlDate= date('Y-m-d', $row["date"]); 
    if($previousDate != $mysqlDate) 
    { 
    echo "two different dates"; 
    $previousDate = $mysqlDate; 
    } 

    } 
} else { 
echo "0 results"; 
} 
$conn->close(); 
Powiązane problemy