webForumDet fria alternativet

Rangordna resultaten?

10 svar · 303 visningar · startad av Pudolf

PudolfMedlem sedan juli 2000221 inlägg
#1

Hej, Jag skulle behöva lite hjälp med detta! (Ja, rubriken var kass förresten)

Jag har en tabell som listar produkter såhär:

Tabell 1

[id]___[namn]
1_____Första
2_____Andra
3_____Tredje

Sen har jag en tabell med lite information om produkterna, ungefär såhär: (id motsvarar pid)

Tabell 2

__[id]___[pid]___[namn]___[omdome]
__1_____1______Första______4___
__2_____2______Andra______9___
__3_____3______Tredje______8___
__4_____2______Andra______3___

Sen har jag en sida där jag t ex visar all information om produkten id=2 från Tabell1 (med pid=2 i Tabell 2 alltså), då skulle jag vilja skriva ut på vilken position den produkten ligger om man jämför produkterna omdömen emellan. Alltså snittet för pid=2 är nu 9+3/2=6 som ni ser nu, det betyder att den ligger på position 2, näst bäst alltså, före pid=1, men efter pid=3.

Hoppas ni förstår :)

Tack på förhand!

LarsGMedlem sedan dec. 200012 464 inlägg
#2
select t1.namn, 
  (select count(*) + 1 from table2
      group by pid
      having avg(omdome)
    > (select avg(omdome)
            from table2
           where pid = t1.id)) as pos
 from table1 as t1
 where id = <aktuellt id>

Varför finns namn och id med i table2?

PudolfMedlem sedan juli 2000221 inlägg
#3

Namn och id finns med eftersom jag är newbie :)

Hursomhelst fick jag det inte att fungera, så här ser det ut när jag bakat in koden lite:

$sql_placering = "select t1.namn, (select count(*) + 1 from table2 group by pid having avg(omdome) > (select avg(omdome) from table2 where pid = t1.id)) as pos from table1 as t1 where id = $id";
				 
$sql_result_placering = mysql_query($sql_placering,$connection) 
or die("Fel!");

$row_placering = mysql_fetch_array($sql_result_placering);

Ordet "Fel!" ploppar upp :x
Jag förstod inte så mkt av SQL-koden så jag kunde inte peka ut några fel. Vad kan ha gått snett? :l

LarsGMedlem sedan dec. 200012 464 inlägg
#4

Problemet är att Mysql inte har stöd för denna typ av frågor, dvs där man har en select som en sub-fråga.

Du får dela upp det i flera steg

$sql_placering = "select t1.namn, avg(omdome) as betyg " .
" from table1 as t1 inner join table2 as t2 " .
" on t1.id = t2.pid where t1.id = $id group by t1.namn";

När du har fått fram värdet för betyg så kan du använda det i en ny fråga

$sql_pos = "select count(*) + 1 from table2 " .
" group by pid having avg(omdome) > $betyg";
PudolfMedlem sedan juli 2000221 inlägg
#5

Nu blir det inga felmeddelanden, men $sql_pos verkar bli "1" på alla produkter. Eller jag kanske skriver ut den fel? Jag gjorde iaf så här:

$sql_pos = "select count(*) + 1 from table2 " .
" group by pid having avg(omdome) > $betyg";

$sql_result_pos = mysql_query($sql_pos,$connection) 
or die("Fel!");

$row_pos = mysql_fetch_array($sql_result_pos);

<?php echo number_format($row_pos, 0) . ""; ?>

Sen undrar jag om allt den första SQL-satsen gör är att ta fram snittomdömet för det aktuella pid:et?

För det får jag fram genom att skriva

SELECT AVG(omdome) AS omdome FROM table2 WHERE pid = $id
LarsGMedlem sedan dec. 200012 464 inlägg
#6

Jag tänkte litee fel.

$sql_pos = "select count(*) + 1 from table2 " .
" having avg(omdome) > $betyg";

I den första frågan får du fram namn och snitt, så om du inte vill ha namnet så duger det bra med den fråga du skrev.

PudolfMedlem sedan juli 2000221 inlägg
#7

Nu visas "0" istället för "1" med den nya koden :x

Det har inte nåt med nya eller gammal Mysql att göra?

LarsGMedlem sedan dec. 200012 464 inlägg
#8

0? Det verkar konstigt. Då du har med + 1 i frågan så borde det alltid bli större än 0.

Vad händer om du testar frågan med olika värden för $betyg direkt i Mysql?

Den frågan kräver inte ny version av Mysql.

PudolfMedlem sedan juli 2000221 inlägg
#9

Om jag lägger ett värde mindre eller likamed 6 visas det position: 164, men det gäller på alla produkter. Lustigt nog finns det för tillfället 163 värden i Tabell 2 (Runt 130 produkter i tabell 1).

$sql_pos = "SELECT COUNT(*) + 1 AS placering FROM table2 HAVING AVG(omdome) > 6";
LarsGMedlem sedan dec. 200012 464 inlägg
#10

Det är jag som ute och strular.

Om du gör så här då

$sql_pos = "select distinct  pid from table2 " .
" group by pid having avg(omdome) > $betyg";
$sql_result_pos = mysql_query($sql_pos,$connection) 
or die("Fel!");

$row_pos = mysql_num_rows($sql_result_pos) + 1;
PudolfMedlem sedan juli 2000221 inlägg
#11

Tack så mycket, nu funkar det perfekt :birp

127 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
124 ms — hämta tråd, inlägg och bilagor (db)