Hjälp med att sortera och hämta från tabell! [PHP/MySQL]

Permalänk
Medlem

Hjälp med att sortera och hämta från tabell! [PHP/MySQL]

Hej

Det jag vill göra är att hämta den senaste från varje kategori i tabellen (alltså en där category='1', en där category='2', etc). Men jag har typ ingen aning om hur. Jag har lyckats hämta en från varje kategori, men den tar inte den med högst värde på 'id'.

SELECT title, img_default, id, maintxt, category FROM articles WHERE publish='1' ORDER BY category LIMIT 4

Självklart ger denna query det problem jag beskrev, har testat lite andra olika varianter, men ger samma problem. Hur ser en fungerande query ut?

Svar uppskattas enormt mycket!

Visa signatur

Desktop|i5 3570k(@4,4GHz)|Asus P8Z77-V|AMD 6950|12GB RAM|Crucial BX500 480GB|Manjaro|
Laptop|Lenovo T440s|i7|8GB RAM|Debian Jessie|
Server|Fujitsu Primergy TX1310|G1820|8GB RAM|15TB|Unraid|
Ring, lånad mail

Permalänk
Medlem

Vill du hämta ut title, img_default, id, maintxt och category från det sista id som finns i databasen?

Du kör just nu limit på category och inte på ID. Det du har där visar de 4 första från category.

Kör: ORDER BY id DESC LIMIT 4 så får du fram de 4 sista i alla fall.

Permalänk
Medlem
Skrivet av kobb3:

Vill du hämta ut title, img_default, id, maintxt och category från det sista id som finns i databasen?

Du kör just nu limit på category och inte på ID. Det du har där visar de 4 första från category.

Kör: ORDER BY id DESC LIMIT 4 så får du fram de 4 sista i alla fall.

Grejen är ju den att jag bara vill hämta en av varje från category. Alltså en där category='1' och en där category='2' osv upp till fyra. Kör jag ORDER BY id är jag ju inte garanterad att det resulterar i en från varje kategori.
Blev lite knepigt att förklara (har därför inte lyckats googla fram en lösning).

Visa signatur

Desktop|i5 3570k(@4,4GHz)|Asus P8Z77-V|AMD 6950|12GB RAM|Crucial BX500 480GB|Manjaro|
Laptop|Lenovo T440s|i7|8GB RAM|Debian Jessie|
Server|Fujitsu Primergy TX1310|G1820|8GB RAM|15TB|Unraid|
Ring, lånad mail

Permalänk
Medlem

Gör fyra olika queries då?:P En för varje kategori~~

Visa signatur

Spelrigg: 800D| i7 3930K@4,7 GHz - Custom WC | 32 GB Kingston HyperX Beast | 7970 GHz X-Edition |1x30 Dell U3011, 2x27" | Sennheiser HD650 | Xonar Essence STX |
Laptop: G74SX 17,3" 120 Hz 3D |
Server: Phenom II X4 955BE | Corsair XMS3 8 GB | 16 HDDs, 27 TB |
HTPCs: ASUS EEE Box 1.8 Ghz | Blu-Ray | OCZ Vertex 2 60 GB | 4 GB RAM |

Permalänk
Medlem
Skrivet av Gnejs:

Gör fyra olika queries då?:P En för varje kategori~~

Tänkte ju på det, men är inte det en ganska ful lösning? Borde ju gå på något annat sätt tycker jag.

Visa signatur

Desktop|i5 3570k(@4,4GHz)|Asus P8Z77-V|AMD 6950|12GB RAM|Crucial BX500 480GB|Manjaro|
Laptop|Lenovo T440s|i7|8GB RAM|Debian Jessie|
Server|Fujitsu Primergy TX1310|G1820|8GB RAM|15TB|Unraid|
Ring, lånad mail

Permalänk
Medlem
Skrivet av Xburk:

Grejen är ju den att jag bara vill hämta en av varje från category. Alltså en där category='1' och en där category='2' osv upp till fyra. Kör jag ORDER BY id är jag ju inte garanterad att det resulterar i en från varje kategori.
Blev lite knepigt att förklara (har därför inte lyckats googla fram en lösning).

Fattar faktisk inte vad du vill hämta...En bild säger mycket mer.

Hämta en av vad? Kategori som i Column?

Permalänk

Vill du ha de fyra sista eller den sista ifrån varje kategori?

ordnar efter kategori först, och alla med samma kategori ordnas efter id:

SELECT title, img_default, id, maintxt, category FROM articles WHERE publish='1' ORDER BY category, id LIMIT 4

vet inte om det stämmer helt med det du vill, och jag tror att 4st separata sql-requests är lättaste sättet. Du kanske kan köra nested sql också. Eller union. Väldigt osäker på om det är giltig kod dock:

SELECT title, img_default, id, maintxt, category FROM articles WHERE publish='1' AND category = "1" LIMIT 1 UNION SELECT title, img_default, id, maintxt, category FROM articles WHERE publish='1' AND category = "2" LIMIT 1 UNION SELECT title, img_default, id, maintxt, category FROM articles WHERE publish='1' AND category = "3" LIMIT 1 UNION SELECT title, img_default, id, maintxt, category FROM articles WHERE publish='1' AND category = "4" LIMIT 1)

Visa signatur

Pappy :"Backup: Skyddar mot datafel när du på fyllan raderar 200GB pr0n och laddar hem två säsonger teletubbies istället."
Jocke1100 :"Det är väl en mekanisk kylavledning... Typ analog kylpasta..."

Permalänk
Medlem
Skrivet av kobb3:

Fattar faktisk inte vad du vill hämta...En bild säger mycket mer.

Hämta en av vad? Kategori som i Column?

Kategorin är alltså en kolumn (category) i tabellen articles.

Skrivet av fille3002:

Vill du ha de fyra sista eller den sista ifrån varje kategori?

Den sista från varje kategori.

Skrivet av fille3002:

ordnar efter kategori först, och alla med samma kategori ordnas efter id:

SELECT title, img_default, id, maintxt, category FROM articles WHERE publish='1' ORDER BY category, id LIMIT 4

]

Problemet med den queryn är att jag får fler än en av varje kategori.

Nested eller union sql, är helt nytt för mig. Ska läsa på. Blir väl nog olika querys ändå.

Visa signatur

Desktop|i5 3570k(@4,4GHz)|Asus P8Z77-V|AMD 6950|12GB RAM|Crucial BX500 480GB|Manjaro|
Laptop|Lenovo T440s|i7|8GB RAM|Debian Jessie|
Server|Fujitsu Primergy TX1310|G1820|8GB RAM|15TB|Unraid|
Ring, lånad mail

Permalänk
Medlem
Skrivet av Xburk:

Kategorin är alltså en kolumn (category) i tabellen articles.

Den sista från varje kategori.

Problemet med den queryn är att jag får fler än en av varje kategori.

Nested eller union sql, är helt nytt för mig. Ska läsa på. Blir väl nog olika querys ändå.

Du får såklart 4 stycken om du använder LIMIT 4.

Om du väljer allt i den senaste raden som blivit insatt, dvs det sista id så får du väl det sista som satts in på varje kategori?

Ta en bild på och visa vilka det är du vill ha.

Permalänk
Medlem

det blev fyra queries.

$slide_1 = mysql_query("SELECT title, img_default, id, maintxt FROM articles WHERE publish='1' AND category='1' ORDER BY id DESC LIMIT 1"); $slide_2 = mysql_query("SELECT title, img_default, id, maintxt FROM articles WHERE publish='1' AND category='2' ORDER BY id DESC LIMIT 1"); $slide_3 = mysql_query("SELECT title, img_default, id, maintxt FROM articles WHERE publish='1' AND category='3' ORDER BY id DESC LIMIT 1"); $slide_4 = mysql_query("SELECT title, img_default, id, maintxt FROM articles WHERE publish='1' AND category='4' ORDER BY id DESC LIMIT 1");

@kobb3: hmm. vet inte hur en bild som förklarar detta skulle se ut riktigt, men koden ovan kanske visar.

Denna lösning funkar ju, men är det verkligen en optimal lösning?

Visa signatur

Desktop|i5 3570k(@4,4GHz)|Asus P8Z77-V|AMD 6950|12GB RAM|Crucial BX500 480GB|Manjaro|
Laptop|Lenovo T440s|i7|8GB RAM|Debian Jessie|
Server|Fujitsu Primergy TX1310|G1820|8GB RAM|15TB|Unraid|
Ring, lånad mail

Permalänk
Skrivet av Xburk:

det blev fyra queries.

$slide_1 = mysql_query("SELECT title, img_default, id, maintxt FROM articles WHERE publish='1' AND category='1' ORDER BY id DESC LIMIT 1"); $slide_2 = mysql_query("SELECT title, img_default, id, maintxt FROM articles WHERE publish='1' AND category='2' ORDER BY id DESC LIMIT 1"); $slide_3 = mysql_query("SELECT title, img_default, id, maintxt FROM articles WHERE publish='1' AND category='3' ORDER BY id DESC LIMIT 1"); $slide_4 = mysql_query("SELECT title, img_default, id, maintxt FROM articles WHERE publish='1' AND category='4' ORDER BY id DESC LIMIT 1");

@kobb3: hmm. vet inte hur en bild som förklarar detta skulle se ut riktigt, men koden ovan kanske visar.

Denna lösning funkar ju, men är det verkligen en optimal lösning?

I din kod är det inte den mest optimala lösningen, men jag tror det blir den mest optimala om man tar hänsyn till databasen. Nested sql skulle ge 5 requests, 4 som samlar från olika tabeller och en som "merge-ar" dom till en enda sql-response.

Visa signatur

Pappy :"Backup: Skyddar mot datafel när du på fyllan raderar 200GB pr0n och laddar hem två säsonger teletubbies istället."
Jocke1100 :"Det är väl en mekanisk kylavledning... Typ analog kylpasta..."

Permalänk
Medlem
Permalänk
Testpilot
Skrivet av Marwelln:

Det är inte säkert att det går snabbare (mer optimalt) att ha färre frågor, det är mycket annat som spelar in så som att det går att indexera ordentligt. Frågan du länkar till är ju dessutom en nästlad fråga så det är tveksamt att den räknas som en.

Visa signatur

Kolla gärna in min RGB-LED-ljusstake i galleriet
[Gigabyte GA-Z97MX-Gaming 5][Intel Core i5 4690K][Corsair XMS3 16GB][Asus GeForce RTX 2060 Super Dual Evo OC]

Permalänk
Medlem

Jag tycker LEFT JOIN-lösningen i denna post http://stackoverflow.com/questions/1313120/retrieving-the-las... är attraktiv.

Använd dock den metod som går enklast för dig. Att jag göra något avancerat "bara för att" brukar sällan betala sig.