Autor Zpráva
hellmc
Profil
Ahoyte .... potrebujem zobrazovat duplikaty na stranke kniznice, moj kod vyzera >
function fetch_to_array_duplikaty()
{
    global $od,$po;
    
$q=exeq("SELECT DISTINCT(nazov) AS proto, COUNT(nazov) AS pocet FROM fond WHERE vyradena=0 GROUP BY nazov HAVING pocet > 1 ");
$n=mysqli_num_rows($q);

#$f=exeq("SELECT DISTINCT(nazov) AS proto, COUNT(nazov) AS pocet FROM fond WHERE vyradena=0 GROUP BY nazov HAVING pocet > 1 LIMIT $od,$po");


$f=exeq("SELECT nazov AS proto FROM fond WHERE vyradena=0 GROUP BY nazov HAVING COUNT(*) >1 LIMIT ".$od.",".$po);


    while($x=mysqli_fetch_assoc($f))
    {
    $duplikaty[]=$x['proto'];
    }
    
    for($i=0;$i<count($duplikaty);$i++)
    {

       $q=exeq("SELECT * FROM fond WHERE nazov='".$duplikaty[$i]."'");
       while($f=mysqli_fetch_assoc($q))
       {
       $ret[]=$f;
       }
    }
return array("return"=>$ret,"vsetkych"=>$n);    
}

exeq je mysqli_query, problem ze sa mi zobrazuju aj vyradene dokumenty (vyradena=0) a ich je viac ako dva rovnake (s rovnakym nazvom) ...

Dik za hocijaku pomoc ...

Moderátor juriad: Občas je potřeba použíť [prephp] namísto [pre] pro obarvení zdrojového kódu
juriad
Profil
Namísto cyklu a druhého dotazu polož chytřejší dotaz:

SELECT f.*
FROM fond f
JOIN (
    SELECT nazov AS proto
    FROM fond 
    WHERE vyradena=0 
    GROUP BY nazov 
    HAVING COUNT(*) >1 
    LIMIT $od, $po
) dup
ON f.nazov = dup.proto
ORDER BY f.nazov

Toto ti vrátí všechny knihy, které mají duplicitní název. Ten order by na konci zajistí, že knihy se stejným názvem budou vedle sebe.

Alternativně by ti stačilo přidat podmínku do selectu na 22. řádce (na konec):

SELECT * FROM fond WHERE nazov='...' AND vyradena=0

Mimochodem, je docela špatné vkládat hodnoty do selectů tímto způsobem. Způsobí ti to chybu jakmile budeš mít knihu, jejíž název obsahuje apostrof '. A je to i bezpečnostní díra.
Správně bys měl název escapovat, ale to zavání použitím další globální proměnné.
"SELECT * FROM fond WHERE nazov='" . mysqli_real_escape_string($connection, $duplikaty[$i]) . "'"
hellmc
Profil
juriad:
Dik moc ... tvoje riesenie je super ... mam to>
$f=exeq("SELECT f.*
FROM fond f
JOIN (
    SELECT nazov AS proto
    FROM fond 
    WHERE vyradena=0 
    GROUP BY nazov 
    HAVING COUNT(*) >1 
    LIMIT $od, $po
) dup
ON f.nazov = dup.proto
ORDER BY f.nazov");

    
    while($x=mysqli_fetch_assoc($f))
    {
    $ret[]=$x;
    }
Ale ak je duplikatov viac ako dva, stale to zobrazuje aj vyradene .... ak pridam do druheho selectu AND vyradena = 0, je to ok ... dik este raz

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0