Autor Zpráva
trancemaniac
Profil *
Ahoj, už delší dobu se pokusim vytvořit jeden SQL dotaz. Databázi mám v MS Accesu, přistupuju k ním v php přes ODBC.
Takže mám dvě tabulky souboje (id,nazevSouboje,id_kandidata1,id_kandidata2,hlasy_kandidat1,hlasy_kan didat2) a kandidati (id,jmeno_kandidata,). Princip je takovej, že se může vytvořit souboj ze dvou kandidátů a každý může být v souboji s každým a pro ně se hlasuje.
A já potřebuji vybrat z tabulek 10 nejvýznamějších soubojů (tzn. 10 soubojů, které mají největší počet hlasů) tedy potřebuju vybrat název souboje, jméno vedoucího kandidáta, jeho počet hlasů a celkový počet hlasů v souboji (pro výpočet procent).
Takže je potřeba nejdřiv vybrat 10 nejvýznamějších soubojů, vypsat jejich názvy, poté zjistit který kandidát má víc hlasů, vypsat jeho jméno a počet bodů a pak vypočitat procenta. Problém je tedy ve výběru id_candidata s největším počtem hlasů a následný vypsání jeho jména. Už sem toho zkoušel někjolikrát, ale vždycky jsem na něco narazil. Snad sem to popsal jasně, pokud ne, napište co potřebujete vědět. Mockrát děkuju
nightfish
Profil
v mysql by to bylo zhruba takto, zřejmě bude potřeba drobně upravit pro Access

select nazevSouboje, k1.jmeno_kandidata, k2.jmeno_kandidata, hlasy_kandidat1, hlasy_kandidat2 from souboje left join kandidati k1 on souboje.id_kandidata1 = k1.id left join kandidati k2 on souboje.id_kandidata2 = k2.id order by (hlasy_kandidat1 + hlasy_kandidat2) desc limit 10
trancemaniac
Profil *
Díky, vyzkouším to, jen prosím tě, můžem mi napsat co znamená to k1 a k2? Sice jsem přečet nějaký články o JOIN, ale tomuhle moc nerozumím proč to tam je.
nightfish
Profil
Díky, vyzkouším to, jen prosím tě, můžem mi napsat co znamená to k1 a k2? Sice jsem přečet nějaký články o JOIN, ale tomuhle moc nerozumím proč to tam je.
k1 a k2 jsou aliasy názvu tabulky (tzn. sloupce připojené tabulky se pak nejmenují kandidati.id, kandidati.jmeno_kandidata, nýbrž k1.id, k1.jmeno_kandidata, což mi umožní připojit tu tabulku kandidati k souboje dvakrát, pokaždé s jinými "parametry"
trancemaniac
Profil *
Takže jsem vyzkoušel ten dotaz. Pro Access to bohužel nefunguje, je nejspíš problém se syntaxí u druhýho JOINu, s jedním mi to jde vždy, ale když v SQL dotazu mám dva tak to hodí chybu. Na netu jsem nikde nenašel příklad kde by byly dva JOINy, musim ještě hledat.
Každopádně v MySql to jde, vrátí mi to jméno souboje, jméno kandidáta 1, jméno kandidáta 2, hlasy kandidáta 1 a hlasy kandidáta 2. Tedy musím výsledky porovnávat na straně PHP a pak je vypsat? Jinak to nepůjde?
trancemaniac
Profil *
Pro MySql se mi podařilo sestrojit toto:

SELECT GREATEST(hlasy_kandidat1,hlasy_kandidat2) as nejHlas, nazevSouboje, jmeno_kandidata from souboje, kandidati where IF(hlasy_kandidat1>hlasy_kandidat2, id_kandidata1,id_kandidata2) = kandidati.id

Nevim jestli to je nejlepší řešení, ale funguje tak jak jsem chtěl. Jenže ne pro Access, ale pro MySQL, funkce GREATEST a IF pro zřejmě Access nemá. Tak kdyby někdo tušil jak to předělat pro něj, tak prosím poraďte. Dík
Kajman_
Profil *
select nazevSouboje, k1.jmeno_kandidata, k2.jmeno_kandidata, hlasy_kandidat1, hlasy_kandidat2
from souboje, kandidati as k1, kandidati as k2
where souboje.id_kandidata2 = k2.id and souboje.id_kandidata1 = k1.id
order by (hlasy_kandidat1 + hlasy_kandidat2) desc
limit 10


A takhle přes cross join to taky nejde?
trancemaniac
Profil *
Kajman_ Paráda, tohle už funguje, jen sem to lehce upravil, aby to vyhodilo jména obou kandidátů.
Škoda, že Access nemá takový možnosti jako MySQL, ale tenhle dotaz je lepší řešení než jak jsem to měl doteď:
  $select_souboje = "SELECT  * from souboje order by ( hlasy_kandidat1+ hlasy_kandidat2) desc"; 
  $result = odbc_exec($linkid,$select_souboje) or die ("Nepodařilo se připojit k tabulce");
  
  while ($row = odbc_fetch_array($result)){
  
    $row['hlasy_kandidat1'] > $row['hlasy_kandidat2'] ? $a= $row['id_kandidata1'] : $a = $row['id_kandidata2'];
    $row['hlasy_kandidat1'] > $row['hlasy_kandidat2'] ? $hlasy = $row['hlasy_kandidat1'] : $hlasy = $row['hlasy_kandidat2'];
    
    $hlasy_celkem = $row['hlasy_kandidat1'] + $row['hlasy_kandidat2'];
    
    // Vybere jméno kandidáta
    $select = "SELECT jmeno_kandidata from kandidati where id=$a";
    $result1 = odbc_exec($linkid,$select) or die ("Nepodařilo se připojit k tabulce");
    $r = odbc_fetch_array($result1);
    
    echo $row['nazevSouboje'];
    echo $r['jmeno_kandidata'];
    echo $hlasy; 
    echo round(($hlasy/$hlasy_celkem) * 100) . "%";
        
  }
Toto téma je uzamčeno. Odpověď nelze zaslat.

0