PudolfMedlem sedan juli 2000221 inlägg 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 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 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 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 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 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 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 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 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 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 Tack så mycket, nu funkar det perfekt :birp