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

Permalänk
Medlem

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

Visa signatur

Chassi: Fractal Design Meshify C Mini | CPU: AMD Ryzen 5 3600 | Kylare: Be Quiet! Dark Rock Pro 4 | Graffe: ASUS 1070 8GB ROG STRIX DC3 | PSU: Corsair RM750X V2 | RAM: Corsair Vengence 32GB 3200 MHz | MOBO: MSI B450M MORTAR MAX
CS:GO-Maps (App) Sweclockers (App)

Permalänk
Medlem

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.

Visa signatur

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

Permalänk
Medlem
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.

Visa signatur

Chassi: Fractal Design Meshify C Mini | CPU: AMD Ryzen 5 3600 | Kylare: Be Quiet! Dark Rock Pro 4 | Graffe: ASUS 1070 8GB ROG STRIX DC3 | PSU: Corsair RM750X V2 | RAM: Corsair Vengence 32GB 3200 MHz | MOBO: MSI B450M MORTAR MAX
CS:GO-Maps (App) Sweclockers (App)

Permalänk
Medlem

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

Visa signatur

R7-3700X, B450M Mortar MAX, 32GB DDR4 @ 3200, RTX 2080, Corsair CX650M Rev2

Permalänk
Medlem

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

Permalänk
Medlem
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.

Visa signatur

Chassi: Fractal Design Meshify C Mini | CPU: AMD Ryzen 5 3600 | Kylare: Be Quiet! Dark Rock Pro 4 | Graffe: ASUS 1070 8GB ROG STRIX DC3 | PSU: Corsair RM750X V2 | RAM: Corsair Vengence 32GB 3200 MHz | MOBO: MSI B450M MORTAR MAX
CS:GO-Maps (App) Sweclockers (App)

Permalänk
Medlem

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.

Visa signatur

Citera mig om du vill att jag ska hitta till ditt svar.
airikr.me /device:desktop. Andra projekt: Keizai, Koroth & Serenum.

Permalänk
Medlem
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.

Visa signatur

Windows 11 Pro | Intel i7 8700 | ASUS Prime Z370-P | Corsair 16GB 3000MHz | ASUS GTX 1080 | Fractal Design Define S | Corsair RM750x | Hyper 212 EVO

Permalänk
Medlem

*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);

Visa signatur

NZXT H510 Flow MSI B450 Tomahawk MAX
AMD Ryzen 5800X3D RX 7900XTX Kingston Fury 64GB

Permalänk
Medlem

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"; } } ?>

Visa signatur

MSI B650 Tomahawk, 7800X3D, RTX 3080, 32GB DDR5 6000MHz, MSI MPG A850G

Permalänk
Medlem
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!

Visa signatur

Citera mig om du vill att jag ska hitta till ditt svar.
airikr.me /device:desktop. Andra projekt: Keizai, Koroth & Serenum.

Permalänk
Medlem
Skrivet av Airikr:

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.

Visa signatur

MSI B650 Tomahawk, 7800X3D, RTX 3080, 32GB DDR5 6000MHz, MSI MPG A850G

Permalänk
Medlem
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

Visa signatur

Citera mig om du vill att jag ska hitta till ditt svar.
airikr.me /device:desktop. Andra projekt: Keizai, Koroth & Serenum.

Permalänk
Medlem

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

Visa signatur

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

Permalänk
Medlem

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

Visa signatur

MSI B650 Tomahawk, 7800X3D, RTX 3080, 32GB DDR5 6000MHz, MSI MPG A850G