Forumdelen sponsras av

Loopa databas-värden och dela upp efter grupp. (MySQL och PHP).

Trädvy Permalänk
Medlem
Plats
Småland
Registrerad
Sep 2012

Loopa databas-värden och dela upp efter grupp. (MySQL och PHP).

Hejsan.

Får ge det ett försök här också då jag inte lyckas googla fram svaret på hur man går till väga.
Det är som så att jag bygger en sida med hjälp av PHP och MySQL, där jag lista upp alla resultat från en tabell.
Använder för tillfället en while loop med fetch_assoc och den listar upp alla resultat som den ska.

Men nu är det som så att jag vill ha en rubrik mellan diverse grupper/kategorier/genres.
D.vs. en rubrik under sista av den raden med den specifika kategorin.
Man skulle väl kunna göra ny query för varje kategori och dela upp det manuellt, men ser lite B ut.

Det ska se ut som liknande;

Kategori 1...
Rad 1
Rad 2
Rad 3

Kategori 2...
Rad 4
Rad 5
Rad 6

Tabellen är uppbyggd likt(illustration);
id | link | text | genre

1 | Länken | Rad 1 | Kategori 1
2 | Länken | Rad 2 | Kategori 1
3 | Länken | Rad 3 | Kategori 1
4 | Länken | Rad 4 | Kategori 2
5 | Länken | Rad 5 | Kategori 2
6 | Länken | Rad 6 | Kategori 2

Det ska med andra ord bli grupperat efter kolumn "genre" och skrivas en rubrik över varje grupp med namnet på den genren.
Hur går jag enklast till väga. Är ju en simpel funktion.
(Tänkte lägga till ytterligare en till kolumn med genreID också, för att kunna hämta med ett ID också.)

Tack på förhand!

Mvh

Chassi: Fractal Design R5 Black | CPU: Intel i7 3770K @ 4.5 GHz | Kylare: Corsair H80i GT | Graffe: ASUS 1070 8GB ROG STRIX DC3 | PSU: Antec 620 W | RAM: Corsair Vengence 16GB 1600 MHz | MOBO: Asus P8Z77-V Pro
CS:GO-Maps (App) Sweclockers (App)

Trädvy Permalänk
Medlem
Plats
Örebro
Registrerad
Jan 2011

En query för varje kategori eller en gemensam query för att sedan sortera resultatet i minnet. Beror på hur mycket data vi pratar om och om databasanropen behöver gå över nätverket eller ej. Finns för och nackdelar med allt.

Generellt gäller KISS principen. Gör det inte mer komplicerat än nödvändigt. Jag skulle nog gjort en query per kategori förutsatt att det inte ger prestandaproblem.

He who hasn't hacked assembly language as a youth has no heart. He who does so as an adult has no brain.
~John Moore

Trädvy Permalänk
Medlem
Plats
Småland
Registrerad
Sep 2012
Skrivet av Anaii:

En query för varje kategori eller en gemensam query för att sedan sortera resultatet i minnet. Beror på hur mycket data vi pratar om och om databasanropen behöver gå över nätverket eller ej. Finns för och nackdelar med allt.

Generellt gäller KISS principen. Gör det inte mer komplicerat än nödvändigt. Jag skulle nog gjort en query per kategori förutsatt att det inte ger prestandaproblem.

Okej. Det rör sig som ca 200 rader. Och ca 18 kategorier. Där namn på raden(titel), länk/url(ett ID bara som läggs på i hrefen i loopen) samt kategorin/genren finns. Och det är inga planer på att lägga till fler rader.
Det känns som att det finns risk för prestandaproblem dock. Det rör sig då i såna fall om 18 queries. Men inte provat det så vet ej.

Chassi: Fractal Design R5 Black | CPU: Intel i7 3770K @ 4.5 GHz | Kylare: Corsair H80i GT | Graffe: ASUS 1070 8GB ROG STRIX DC3 | PSU: Antec 620 W | RAM: Corsair Vengence 16GB 1600 MHz | MOBO: Asus P8Z77-V Pro
CS:GO-Maps (App) Sweclockers (App)

Trädvy Permalänk
Medlem
Plats
Norrköping
Registrerad
Jul 2006

Finns kategorierna i en egen tabell? Om de gör det så kan du göra en enkel subquery.

Här är ett exempel-

SELECT *, (SELECT CategoryName From Categories WHERE ID = Kategori) AS KategoriNamn FROM MyTable ORDER BY Kategori ASC //Kan även göras med en join SELECT L.*,R.CategoryName AS KategoriNamn FROM MyTable AS L JOIN Categories AS R ON L.Kategori=R.ID ORDER BY L.Kategori ASC

R5-1600X, GA-AB-350M-G3, 16GB DDR4 @ 2666, RX580 8GB, Corsair CX650M Rev2

Trädvy Permalänk
Medlem
Plats
Norrland
Registrerad
Feb 2004

Kan inte GROUP BY göra jobbet åt dig? Nog ska du inte behöva 18 olika queryn.

Alternativt göra en funktion som hämtar för den angivna kategorin.

Skickades från m.sweclockers.com

Trädvy Permalänk
Medlem
Plats
Småland
Registrerad
Sep 2012
Skrivet av BuruZ:

Kan inte GROUP BY göra jobbet åt dig? Nog ska du inte behöva 18 olika queryn.

Alternativt göra en funktion som hämtar för den angivna kategorin.

Skickades från m.sweclockers.com

Dessvärre inte. Förmodligen gör jag fel. Men när jag kör GROUP BY så dyker bara första raden i varje specifik kategori upp, en efter en.
D.v.s. Första raden från första kategorin, Första raden i andra kategorin, Första raden i tredje kategorin osv.
Jag vill få med alla rader från alla kategorier i ordning med titel för varje kategori.

KATEGORI 1
Rad i den kategorin
Rad i den kategorin

KATEGORI 2
Rad i den kategorin
Rad i den kategorin

KATEGORI 3
Rad i den kategorin
Rad i den kategorin

Använder just nu en while-loop vilket förmodligen är problemet.

Chassi: Fractal Design R5 Black | CPU: Intel i7 3770K @ 4.5 GHz | Kylare: Corsair H80i GT | Graffe: ASUS 1070 8GB ROG STRIX DC3 | PSU: Antec 620 W | RAM: Corsair Vengence 16GB 1600 MHz | MOBO: Asus P8Z77-V Pro
CS:GO-Maps (App) Sweclockers (App)

Trädvy Permalänk
Medlem
Plats
Hammarö
Registrerad
Jan 2004

Först loopar du ut huvudkategorierna. I den loopen, skriver du en SQL-fråga, som du loopar ut i själva huvudloopen. Sen är det klart.

Exempel:

$get_categories = sql("SELECT * FROM table WHERE id_category = '0'"); foreach($get_categories AS $category) { $get_subcategories = sql("SELECT * FROM table WHERE id_category = :idcategory"); echo $category['name']; foreach($get_subcategories AS $subcategory) { echo $subcategory['name']; } }

mysql_connect() är för övrigt döende (källa). PDO är det som gäller nu för tiden.

Citera mig om du önskar ett snabbare svar.
Min blogg

Trädvy Permalänk
Medlem
Plats
Tyresö
Registrerad
Apr 2008
Skrivet av davvarn:

Dessvärre inte. Förmodligen gör jag fel. Men när jag kör GROUP BY så dyker bara första raden i varje specifik kategori upp, en efter en.
D.v.s. Första raden från första kategorin, Första raden i andra kategorin, Första raden i tredje kategorin osv.

Det är precis så du skulle kunna hämta namnen på alla dina unika kategorier. Sedan kan du använda en while för att loopa varje kategori och skriva ut dess namn. I varje while-iteration kan du sedan hämta alla rader som tillhör den kategorin. Typ: SELECT * FROM dintabell WHERE genre = 'kategorinamn'.

Vill du inte göra många anrop mot databasen kan du istället göra ett anrop och lösa allt med kod i efterhand.

Observera att man normalt bryter ut den typ av redundant data du har i kolumnen genre till en egen tabell.

Trädvy Permalänk
Medlem
Registrerad
Maj 2013

*edit*
Osäker på vad dina kolumner innehåller, men jag antar det var "text" dom du menar är titeln?

Borde inte följande fungera?

SELECT * FROM table GROUP BY genre ORDER BY text DESC

Resultatet sparas i t.ex. $items som du sedan loopar igenom med en for-each loop.

for($items as $item){ // t.ex. $item->genre, $item->link, $item->id, $item->text }

Är du osäker på hur datastrukturen ser ut för $items så kan du använda

print_r($items); //eller var_dump($items);

M-ITX: Fractal Design Node 304 Gigabyte H97N i7 4790k Msi GTX980 Gaming Ballistix Sport 16GB @ 1600MHz

Trädvy Permalänk
Medlem
Registrerad
Okt 2002

Hittade en gammal kodsnutt som jag postat på phpportalen för ett decennium sedan.
Samma princip, bara att koden nedan skriver ut rubriken som månad/år.
Som sagt ett tag sedan, men det kanske hjälper dig på traven.

<?php $result = mysql_query ( "SELECT DATE_FORMAT(datum, '%d') AS day, DATE_FORMAT(datum, '%M') AS month, DATE_FORMAT(datum, '%Y') AS year, id, rubrik, skribent FROM nyheter ORDER BY datum DESC" ); if ( mysql_num_rows ( $result ) > 0 ) { while ( $row = mysql_fetch_assoc ( $result ) ) { if ( $row['year'] != $c_year ) { echo "<h3>" . $row['year'] . "</h3>\r\n"; $c_year = $row['year']; } if ( $row['month'] != $c_month ) { echo "\t<h4>" . $row['month'] . "</h4>\r\n"; $c_month = $row['month']; } echo "\t\t" . $row['day'] . " <a href='news.php?id=".$row['id']."'>" . $row['rubrik'] . "</a><br />\r\n"; } } ?>

Trädvy Permalänk
Medlem
Plats
Hammarö
Registrerad
Jan 2004
Skrivet av samurai:

Hittade en gammal kodsnutt som jag postat på phpportalen för ett decennium sedan.
Samma princip, bara att koden nedan skriver ut rubriken som månad/år.
Som sagt ett tag sedan, men det kanske hjälper dig på traven.

<?php $result = mysql_query ( "SELECT DATE_FORMAT(datum, '%d') AS day, DATE_FORMAT(datum, '%M') AS month, DATE_FORMAT(datum, '%Y') AS year, id, rubrik, skribent FROM nyheter ORDER BY datum DESC" ); if ( mysql_num_rows ( $result ) > 0 ) { while ( $row = mysql_fetch_assoc ( $result ) ) { if ( $row['year'] != $c_year ) { echo "<h3>" . $row['year'] . "</h3>\r\n"; $c_year = $row['year']; } if ( $row['month'] != $c_month ) { echo "\t<h4>" . $row['month'] . "</h4>\r\n"; $c_month = $row['month']; } echo "\t\t" . $row['day'] . " <a href='news.php?id=".$row['id']."'>" . $row['rubrik'] . "</a><br />\r\n"; } } ?>

Så det var därifrån jag kände igen ditt smeknamn och din visningsbild från!

Citera mig om du önskar ett snabbare svar.
Min blogg

Trädvy Permalänk
Medlem
Registrerad
Okt 2002
Skrivet av edgren:

Så det var därifrån jag kände igen ditt smeknamn och din visningsbild från!

hehe precis Var ju ett tag sedan man var aktiv där dock.

Trädvy Permalänk
Medlem
Plats
Hammarö
Registrerad
Jan 2004
Skrivet av samurai:

hehe precis Var ju ett tag sedan man var aktiv där dock.

Samma här. Det forumet är ju inte så värst aktivt nu för tiden. Speciellt efter att Malte och Dectgap hade avlidit

Citera mig om du önskar ett snabbare svar.
Min blogg

Trädvy Permalänk
Medlem
Plats
skåne
Registrerad
Jun 2004

Gör en query och sortera den på kategori.
I loopen kan du sen bara kolla om kategorin är samma som föregående, och om den inte är det; skriv ut rubriken.
Alternativt kan du bygga en multidimensionell array från queryn och sen använda den för loopen.
Men som sagt, KISS. Första alternativet är nog snabbast/enklast/good enough 😄

Skickades från m.sweclockers.com

Oldschool [å:ldsku:l] adj. Användandet av datorprodukter som är äldre än 3 månader.

Trädvy Permalänk
Medlem
Registrerad
Okt 2002

@edgren: Fasen vad tråkigt. Ja jag hörde det