WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   MySQL förfrågan: mysql_query, WHERE-satser (https://www.wn.se/forum/showthread.php?t=18385)

Timofey 2007-01-01 16:57

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)"));
$b = mysql_fetch_row(mysql_query("SELECT link, text FROM tabell WHERE id IN ($y-1)"));
...

$y är ett visst angivet sorteringsnummer
"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.

Timofey 2007-01-01 17:12

2 bifogad(e) fil(er)
Här är en skiss över hur tabellen ser ut

Eddie 2007-01-01 20:21

$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.

Timofey 2007-01-01 21:29

AAh, tack så mycket! Ska prova med detta.

Magnus_A 2007-01-02 11:09

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.

Timofey 2007-01-03 12:57

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?

Timofey 2007-01-03 13:01

Kanske ska jag räkna antalet rows efter select
$num = mysql_num_rows($result);
Och sedan skapa ny numrering
$y = $num;

Timofey 2007-01-03 13:12

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.

eg0master 2007-01-03 13:17

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);
some kind of loop {
 $row = mysql_fetch_row($rs);
}

Då blir det nog enklare för dig att dels skapa en SQL sats som hämtar just det du vill ha och att jobba med de olika raderna. Samtidigt som frågan bara körs en gång.

Timofey 2007-01-03 14:05

Citat:

Originally posted by eg0master@Jan 3 2007, 14:17
istället skall du köra:
Kod:

$rs = mysql_query(SQL_SATS);
some kind of loop {
 $row = mysql_fetch_row($rs);
}


Ja, det kan jag prova med, men var anger jag radnummer? eller är det ett värde jag ska ha i loopen som jag plussar på upp till t.ex. 10 och sedan ...?

Okey, vänta med att svara... jag ska lära mig lite mer på egen hand.

eg0master 2007-01-03 16:32

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...

Timofey 2007-01-03 16:56

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")
 {
$a = mysql_fetch_row(mysql_query("SELECT link, text, cat, id FROM foto WHERE cat='dju' ORDER BY `id` DESC LIMIT 1"));
$b = mysql_fetch_row(mysql_query("SELECT link, text, cat, id FROM foto WHERE cat='dju' ORDER BY `id` DESC LIMIT 1,2"));
$c = mysql_fetch_row(mysql_query("SELECT link, text, cat, id FROM foto WHERE cat='dju' ORDER BY `id` DESC LIMIT 2,3"));
$d = mysql_fetch_row(mysql_query("SELECT link, text, cat, id FROM foto WHERE cat='dju' ORDER BY `id` DESC LIMIT 3,4"));
$e = mysql_fetch_row(mysql_query("SELECT link, text, cat, id FROM foto WHERE cat='dju' ORDER BY `id` DESC LIMIT 4,5"));
$f = mysql_fetch_row(mysql_query("SELECT link, text, cat, id FROM foto WHERE cat='dju' ORDER BY `id` DESC LIMIT 5,6"));
$g = mysql_fetch_row(mysql_query("SELECT link, text, cat, id FROM foto WHERE cat='dju' ORDER BY `id` DESC LIMIT 6,7"));
$h = mysql_fetch_row(mysql_query("SELECT link, text, cat, id FROM foto WHERE cat='dju' ORDER BY `id` DESC LIMIT 7,8"));
$i = mysql_fetch_row(mysql_query("SELECT link, text, cat, id FROM foto WHERE cat='dju' ORDER BY `id` DESC LIMIT 8,9"));
$j = mysql_fetch_row(mysql_query("SELECT link, text, cat, id FROM foto WHERE cat='dju' ORDER BY `id` DESC LIMIT 9,10"));
$k = mysql_fetch_row(mysql_query("SELECT link, text, cat, id FROM foto WHERE cat='dju' ORDER BY `id` DESC LIMIT 10,11"));
$l = mysql_fetch_row(mysql_query("SELECT link, text, cat, id FROM foto WHERE cat='dju' ORDER BY `id` DESC LIMIT 11,12"));
$m = mysql_fetch_row(mysql_query("SELECT link, text, cat, id FROM foto WHERE cat='dju' ORDER BY `id` DESC LIMIT 12,13"));
$n = mysql_fetch_row(mysql_query("SELECT link, text, cat, id FROM foto WHERE cat='dju' ORDER BY `id` DESC LIMIT 13,14"));
$o = mysql_fetch_row(mysql_query("SELECT link, text, cat, id FROM foto WHERE cat='dju' ORDER BY `id` DESC LIMIT 14,15"));
$p = mysql_fetch_row(mysql_query("SELECT link, text, cat, id FROM foto WHERE cat='dju' ORDER BY `id` DESC LIMIT 15,16"));
 }
elseif ($cvalue=="lan")
 {
$a = mysql_fetch_row(mysql_query("SELECT link, text, cat, id FROM foto WHERE cat='lan' ORDER BY `id` DESC LIMIT 1"));
$b = mysql_fetch_row(mysql_query("SELECT link, text, cat, id FROM foto WHERE cat='lan' ORDER BY `id` DESC LIMIT 1,2"));
$c = mysql_fetch_row(mysql_query("SELECT link, text, cat, id FROM foto WHERE cat='lan' ORDER BY `id` DESC LIMIT 2,3"));
$d = mysql_fetch_row(mysql_query("SELECT link, text, cat, id FROM foto WHERE cat='lan' ORDER BY `id` DESC LIMIT 3,4"));
$e = mysql_fetch_row(mysql_query("SELECT link, text, cat, id FROM foto WHERE cat='lan' ORDER BY `id` DESC LIMIT 4,5"));
$f = mysql_fetch_row(mysql_query("SELECT link, text, cat, id FROM foto WHERE cat='lan' ORDER BY `id` DESC LIMIT 5,6"));
$g = mysql_fetch_row(mysql_query("SELECT link, text, cat, id FROM foto WHERE cat='lan' ORDER BY `id` DESC LIMIT 6,7"));
$h = mysql_fetch_row(mysql_query("SELECT link, text, cat, id FROM foto WHERE cat='lan' ORDER BY `id` DESC LIMIT 7,8"));
$i = mysql_fetch_row(mysql_query("SELECT link, text, cat, id FROM foto WHERE cat='lan' ORDER BY `id` DESC LIMIT 8,9"));
$j = mysql_fetch_row(mysql_query("SELECT link, text, cat, id FROM foto WHERE cat='lan' ORDER BY `id` DESC LIMIT 9,10"));
$k = mysql_fetch_row(mysql_query("SELECT link, text, cat, id FROM foto WHERE cat='lan' ORDER BY `id` DESC LIMIT 10,11"));
$l = mysql_fetch_row(mysql_query("SELECT link, text, cat, id FROM foto WHERE cat='lan' ORDER BY `id` DESC LIMIT 11,12"));
$m = mysql_fetch_row(mysql_query("SELECT link, text, cat, id FROM foto WHERE cat='lan' ORDER BY `id` DESC LIMIT 12,13"));
$n = mysql_fetch_row(mysql_query("SELECT link, text, cat, id FROM foto WHERE cat='lan' ORDER BY `id` DESC LIMIT 13,14"));
$o = mysql_fetch_row(mysql_query("SELECT link, text, cat, id FROM foto WHERE cat='lan' ORDER BY `id` DESC LIMIT 14,15"));
$p = mysql_fetch_row(mysql_query("SELECT link, text, cat, id FROM foto WHERE cat='lan' ORDER BY `id` DESC LIMIT 15,16"));
 }

...

else
 {
$a = mysql_fetch_row(mysql_query("SELECT link, text FROM foto WHERE id IN ($y)"));
$b = mysql_fetch_row(mysql_query("SELECT link, text FROM foto WHERE id IN ($y-1)"));
$c = mysql_fetch_row(mysql_query("SELECT link, text FROM foto WHERE id IN ($y-2)"));
$d = mysql_fetch_row(mysql_query("SELECT link, text FROM foto WHERE id IN ($y-3)"));
$e = mysql_fetch_row(mysql_query("SELECT link, text FROM foto WHERE id IN ($y-4)"));
$f = mysql_fetch_row(mysql_query("SELECT link, text FROM foto WHERE id IN ($y-5)"));
$g = mysql_fetch_row(mysql_query("SELECT link, text FROM foto WHERE id IN ($y-6)"));
$h = mysql_fetch_row(mysql_query("SELECT link, text FROM foto WHERE id IN ($y-7)"));
$i = mysql_fetch_row(mysql_query("SELECT link, text FROM foto WHERE id IN ($y-8)"));
$j = mysql_fetch_row(mysql_query("SELECT link, text FROM foto WHERE id IN ($y-9)"));
$k = mysql_fetch_row(mysql_query("SELECT link, text FROM foto WHERE id IN ($y-10)"));
$l = mysql_fetch_row(mysql_query("SELECT link, text FROM foto WHERE id IN ($y-11)"));
$m = mysql_fetch_row(mysql_query("SELECT link, text FROM foto WHERE id IN ($y-12)"));
$n = mysql_fetch_row(mysql_query("SELECT link, text FROM foto WHERE id IN ($y-13)"));
$o = mysql_fetch_row(mysql_query("SELECT link, text FROM foto WHERE id IN ($y-14)"));
$p = mysql_fetch_row(mysql_query("SELECT link, text FROM foto WHERE id IN ($y-15)"));
 }

Får väl ta och förbättra koden senare. Huvudsaken just nu är att det ska funka... och det gör det ... bara lite segt. ;)

eg0master 2007-01-03 17:22

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")
{
$rs = mysql_query("SELECT link, text, cat, id FROM foto WHERE cat='dju' ORDER BY `id` DESC LIMIT 15");
$a = mysql_fetch_row($rs);
$b = mysql_fetch_row($rs);
$c = mysql_fetch_row($rs);
...
$p = mysql_fetch_row($rs);
}
...

Men jag tror du behöver lära dig:
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/

Timofey 2007-01-03 18:09

Citat:

Ursprungligen postat av eg0master
Pardon my french men du är ju inte riktigt klok... *
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.

HAHAHAHhaa :D
Vi tar det imorgon :)

Citat:

Ursprungligen postat av eg0master
Kod:

if ($cvalue=="dju")
{
$rs = mysql_query("SELECT link, text, cat, id FROM foto WHERE cat='dju' ORDER BY `id` DESC LIMIT >>>16<<<");
$a = mysql_fetch_row($rs);
$b = mysql_fetch_row($rs);
$c = mysql_fetch_row($rs);
...
$p = mysql_fetch_row($rs);
}
...


Detta funkade. Ska använda loops lite senare.

!Konstigt nog försvinner "$" tecken då man klickar på "Snabbcitera"

mersault 2007-01-04 00:23

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.

Timofey 2007-01-04 12:09

Citat:

Originally posted by mersault@Jan 4 2007, 01:23
alltinggratis Det där var det roligaste jag läst på WN på länge... =) Hoppas du bjuder på det skrattet.

Absolut! Tack för att du uppskattar det =)))

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!

Magnus_A 2007-01-04 22:44

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