![]() |
Jag har idag bestämt mig för att bygga ut en befintlig webbplats och har problem med MySQL-sortering.
Problemet är följande: Jag ska välja ut data från en MySQL-tabell ("tabell") enligt följande. Kod:
$a = mysql_fetch_row(mysql_query("SELECT link, text FROM tabell WHERE id IN ($y)")); "id" är bara ett nummer (som ökar med varje rad just nu) Detta funkade som det ska, men nu vill jag även sortera datan med ännu ett avseende. Jag har byggt in en ny kolumn i tabellen som heter "typ". "typ" kan bara innehålla ett av följande texter: "bil" "hus" eller "bat" (dessa är bara exempel, inget med mitt projekt att göra) Jag vill att $a ska vara den första raden i tabellen där $typ är "bil" och $b ska vara den andra raden i tabellen där $typ är "bil" och på samma sätt att $a ska vara den första raden i tabellen där $typ är "hus" och $b ska vara den andra raden i tabellen där $typ är "hus" HUR GÖR JAG DETTA? Sedan kommer jag bygga ut detta med if-satser if ($typ=="bil") *{ $a = mysql_fetch_row(mysql_query("SELECT link, text FROM tabell WHERE id IN ($y)")); $b = ... *} elseif ($typ=="hus") *{ $a = mysql_fetch_row(mysql_query("SELECT link, text FROM tabell WHERE id IN ($y)")); $b = ... ... *} Röd text = fel kod Jag tror inte jag har förklarat så bra, så fråga om ni inte förstår. Jag har noll koll på MySQL-funktioner, så skriv gärna så tydligt som möjligt, tack. |
2 bifogad(e) fil(er)
Här är en skiss över hur tabellen ser ut
|
$a = mysql_fetch_row(mysql_query("SELECT id, link, text FROM tabell WHERE typ = $typ order by id Limit 1"));
$b = mysql_fetch_row(mysql_query("SELECT id, link, text FROM tabell WHERE typ = $typ and id > ". $a['id'] ." order by id Limit 1")); Allternativt: $a = mysql_fetch_row(mysql_query("SELECT id, link, text FROM tabell WHERE typ = $typ order by id desc Limit 1")); $b = mysql_fetch_row(mysql_query("SELECT id, link, text FROM tabell WHERE typ = $typ and id < ". $a['id'] ." order by id desc Limit 1")); om du vill ha i omvänd ordning osv.. något i den stilen borde funka. |
AAh, tack så mycket! Ska prova med detta.
|
Select * from tabell where typ='bil' order by id limit 2
Ger de två rader där typ är lika med 'bil' och de två lägsta id-numren i dettta urval. I din exempel tabell har du sorterat id kolumnen i omvänd ordning. vill du ha det så även i din fråga så skriv ...order by id desc ... Ett tips: fokusera på att skriva bra frågor i Mysql, är mycket lättare att utgå från väl formaterade data än att försöka rådda till det i scripten sen. Och en förutsättning för att skriva bra frågor är ofta att databasen är väl upställd. Tveka inte att bygga om om det behövs. |
Kommer nog använda mig av följande:
$sql = 'SELECT * FROM `tabell` WHERE `typ` = \'bil\' ORDER BY `id` DESC'; Och sedan måste jag välja ut varje rad för sig, hur? |
Kanske ska jag räkna antalet rows efter select
$num = mysql_num_rows($result); Och sedan skapa ny numrering $y = $num; |
Detta verkar funka fram till att jag gör en SELECT.
Sedan uppstår problem när jag ska välja varje rad för sig, för id columnen blir t.ex. 6, 3, 1 istället för 9, 8, 7, 6, 5, 4, 3, 2, 1 Finns det ingen funktion att bara välja de första 10 raderna av selektionen var för sig? $sql = 'SELECT * FROM `tabell` WHERE `typ` = \'bil\' ORDER BY `id` DESC'; Alltså typ funktion för att: VÄLJ rad 1 uppifrån från selektionen $sql VÄLJ rad 2 uppifrån från selektionen $sql ... o.s.v. |
Eftersom ingen annan verkar reagera på det så får väl jag göra det.
Du behöver först av allt lära dig lite om databaser. Det sätt du jobbar med (mysql_fetch_row(mysql_query(...))) är extrem ineffektivt eftersom du dels gör om frågan varje gång (fast det är olika rader urt samma tebell du vill ha) och gör allt förutom fråga ett svårare. istället skall du köra: Kod:
$rs = mysql_query(SQL_SATS); |
Citat:
Okey, vänta med att svara... jag ska lära mig lite mer på egen hand. |
Du får vänta med att läsa...
jag vet inte vad du menar med "radnummer", men första varvet i loopen är ju rimligen rad ett osv... |
Har löst detta nu. Jag förstår inte heller vad jag menar :D
Det fick bli en massa rader med förfrågningar och if-satser... Kod:
if ($cvalue=="dju") |
Pardon my french men du är ju inte riktigt klok... :rolleyes:
För det första så kommer till exempel "LIMIT 1,2" returnera två rader (varav du bara ser den första eftersom du bara gör en mysql_fetch. Detta eftersom andra siffran anger antalet rader i svaret och första "hur många som skall skippas" så alla dina LIMIT skall sluta med ",1" i nuvarande utförande. Och om du av någon anleding vägrar loopa så skulle du förenkla din kod (och förbättra prestanda) så skall du göra så här: Kod:
if ($cvalue=="dju") 1) Hur man använder en databas och vad det är rent allmänt. 2) loopar i PHP (ja eller att programmera över huvud taget). Jo det är kanske en ganska hård ton i mitt inlägg, men jag måste säga att jag (helt utan ironi) är mäkta imponerad av att du över huvud taget lyckats skapa en sida med en databas i botten. Om jag haft dina kunskaper hade jag nog givit upp för länge sedan så all heder till dig! Några länkar som hjälp på vägen: http://www.freewebmasterhelp.com/tutorials/phpmysql http://www.php-mysql-tutorial.com/ |
Citat:
Vi tar det imorgon :) Citat:
!Konstigt nog försvinner "$" tecken då man klickar på "Snabbcitera" |
alltinggratis>> Det där var det roligaste jag läst på WN på länge... =) Hoppas du bjuder på det skrattet.
Instämmer med egomaster men tipsar också om php.net! Leta upp mysql-funktionerna där så hittar du kodexempel på hur du ska använda funktionerna (med loopar!) på ett rationellt sätt. |
Citat:
Nej, men det är mitt första försök att hantera en MySQL databas med php, så det är klart att jag inte har några kunskaper inom detta, men jag har redan under försökets gång lärt mig en massa! |
Visste inte att det gick att krångla till en enkel fråga så extremt...
ingångsvärdet $cvalue är antingen 'dju' eller 'lan' eller något annat... $query =" SELECT link, text, cat, id FROM foto WHERE cat='$cvalue' ORDER BY `id` DESC LIMIT 16"; $result=mysql_query($query); //det vanligaste sättet att loopa igenom ett resultset i php: while($r=mysql_fetch_row($result)){ //gör nåt kul med ditt resultat, till exempel skriv ut det rad för rad: echo " Link: $r[0], Text: $r[1], Cat: $r[2], id: $r[3]. "; } Efter att ha gjort det här ett par hundra gånger så kommer du inte att tveka... |
Alla tider är GMT +2. Klockan är nu 03:16. |
Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson