IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Lucyk
Člen
Avatar
Lucyk:14.7.2015 17:35

Ahoj,

marně hledám na internetu jak na distinct z více sloupců a proto se obracím zde na zkušenější.

Mám-li následující tabulku:

rok     vyrobce jmeno1  prijmeni1       jmeno2  prijmeni2       jmeno3  prijmeni3       poznamka
2010    A       Lukas   Maly                                                            XXX
2010    B       Jiri    Veliky          Lubomir Koks
2008    A       Zdenek  Maly            Lukas   Maly
2009    A       Adam    Muk             Igor    Vaha            Jiri    Veliky          XXX
2010    C       Karel   Novy            Zdenek  Vak             Lukas   Maly

A z této tabulky bych chtěla vypsat všechna jména a příjmení bez duplicit, s tím, že některé řádky obsahují 1 jméno, některé 2 anebo 3.

Zkoušela jsem následující dotaz:

$sqlCommand = "(SELECT DISTINCT prijmeni1, jmeno1, concat(prijmeni1,' ',jmeno1) FROM tabulka WHERE concat(prijmeni1,' ',jmeno1)
 LIKE '$pismenko%') UNION (SELECT DISTINCT prijmeni2, jmeno2, concat(prijmeni2,' ',jmeno2) FROM tabulka WHERE concat
(prijmeni2,' ',jmeno2) LIKE '$pismenko%') UNION (SELECT DISTINCT prijmeni3, jmeno3, concat(prijmeni3,' ',jmeno3) FROM tabulka
WHERE concat(prijmeni3,' ',jmenoe3) LIKE '$pismenko%')";

Pro výpis používám následující, ikdyž to bude zřejmě blbě:

while (list($lastname1, $firstname1, $lastname2, $firstname2, $lastname3, $firstname3, $lastname4, $firstname4) = mysql_fetch_row($navrat)){

echo ("$lastname1, $firstname1, </br>$lastname2, $firstname2, </br>$lastname3, $firstname3, </br>$lastname4, $firstname4</br>");

Neboť mi to hlásí:

Notice: Undefined offset: 7 in
Notice: Undefined offset: 6 in
Notice: Undefined offset: 5 in
... atd

A když nad tím přemýšlím, tak bych chtěla, aby se to potom vypisovalo pod sebe a můj výše uvedeny zdroj by to vypisoval na řádek.

Poradí prosím někdo, jak to upravit, případně zda máte nějaký lepší návrh pro řešení?

Zkoušela jsem si výběr pouze pro jmeno1, prijmeni1 a to mi fungovalo podle představ, ale pro více sloupečků jsem už nedokázala rozchodit :-(

Děkuji

Editováno 14.7.2015 17:36
 
Odpovědět
14.7.2015 17:35
Avatar
Paul
Člen
Avatar
Odpovídá na Lucyk
Paul:14.7.2015 22:11
SELECT DISTINCT * FROM (Tvůj původní dotaz)

Jinak tohle zavani špatným návrhem. Dal bych jen sloupce jméno a příjmení a k tomu další atribut - typ.

 
Nahoru Odpovědět
14.7.2015 22:11
Avatar
Lucyk
Člen
Avatar
Odpovídá na Paul
Lucyk:15.7.2015 1:03

Takže takto?

$sqlCommand = "SELECT DISTINCT * FROM (SELECT DISTINCT prijmeni1, jmeno1, concat(prijmeni1,' ',jmeno1) FROM tabulka WHERE concat(prijmeni1,' ',jmeno1)
 LIKE '$pismenko%') UNION (SELECT DISTINCT prijmeni2, jmeno2, concat(prijmeni2,' ',jmeno2) FROM tabulka WHERE concat
(prijmeni2,' ',jmeno2) LIKE '$pismenko%') UNION (SELECT DISTINCT prijmeni3, jmeno3, concat(prijmeni3,' ',jmeno3) FROM tabulka
WHERE concat(prijmeni3,' ',jmeno3) LIKE '$pismenko%'))";

pak mi to vypise hlasku

Warning: mysql_fetch_row(): supplied argument is not a valid MySQL result resource in

Tím dalším atributem je co myšleno?

Pak jsem ještě zkusila dát AS

$sqlCommand = "SELECT DISTINCT * FROM (SELECT DISTINCT prijmeni1, jmeno1, concat(prijmeni1,' ',jmeno1) AS nazev FROM tabulka WHERE concat(prijmeni1,' ',jmeno1)
 LIKE '$pismenko%') UNION (SELECT DISTINCT prijmeni2, jmeno2, concat(prijmeni2,' ',jmeno2) AS nazev FROM tabulka WHERE concat
(prijmeni2,' ',jmeno2) LIKE '$pismenko%') UNION (SELECT DISTINCT prijmeni3, jmeno3, concat(prijmeni3,' ',jmeno3) AS nazev FROM tabulka
WHERE concat(prijmeni3,' ',jmeno3) LIKE '$pismenko%'))";

Pro výpis:

while (list($nazev) = mysql_fetch_row($navrat)){
echo ("$nazev</br>");
}

Tak to vypisuje pořád stejnou hlášku.

Editováno 15.7.2015 1:04
 
Nahoru Odpovědět
15.7.2015 1:03
Avatar
shaman
Člen
Avatar
Odpovídá na Lucyk
shaman:15.7.2015 15:54

Takze chces naspat jmeno a prijmeni.
zaroven Meno alebo priezvisko musia zacinat pismenom $pismenko
A nechces tam mat duplicity.

Skus toto

$sql = "
select jmeno1 as jmeno, prijmeni1 as prijmeni FROM tabulka
        WHERE jmeno1 LIKE '$pismenko%' OR prijmeni1 LIKE '$pismenko%'
        GROUP BY (SELECT concat(jmeno1, ' ', prijmeni1))
UNION
select jmeno2 as jmeno, prijmeni2 as prijmeni FROM tabulka
        WHERE jmeno2 LIKE '$pismenko%' OR prijmeni2 LIKE '$pismenko%'
        GROUP BY (SELECT concat(jmeno2, ' ', prijmeni2))
UNION
select jmeno3 as jmeno, prijmeni3 as prijmeni FROM tabulka
        WHERE jmeno3 LIKE '$pismenko%' OR prijmeni3 LIKE '$pismenko%'
        GROUP BY (SELECT concat(jmeno3, ' ', prijmeni3))
";
Editováno 15.7.2015 15:55
Nahoru Odpovědět
15.7.2015 15:54
try {...} catch (Exception ignored) { echo " ¯\_(ツ)_/¯ "; }
Avatar
Lucyk
Člen
Avatar
Odpovídá na shaman
Lucyk:15.7.2015 19:15

Smysl je takový, že se klikne na určité pismenko, na základě kterého vyjednou např. všechna příjmení začínající na A bez duplicit vč. jejich jména.

Zřejmě budu mít ještě někde nějakou chybu, neboť mi to vypisuje:

mysql_fetch_row(): supplied argument is not a valid MySQL result resource in

Složení je takové:

if(!empty($_SERVER['QUERY_STRING'])) {
    switch ($_SERVER['QUERY_STRING'])
    {
        case ($_SERVER['QUERY_STRING']):
            $pismenko = $_SERVER['QUERY_STRING'];
        break;
    }

$spojeni=mysql_connect(......);

$co = "
select jmeno1 as jmeno, prijmeni1 as prijmeni FROM tabulka
        WHERE jmeno1 LIKE '$pismenko%' OR prijmeni1 LIKE '$pismenko%'
        GROUP BY (SELECT concat(jmeno1, ' ', prijmeni1))
UNION
select jmeno2 as jmeno, prijmeni2 as prijmeni FROM tabulka
        WHERE jmeno2 LIKE '$pismenko%' OR prijmeni2 LIKE '$pismenko%'
        GROUP BY (SELECT concat(jmeno2, ' ', prijmeni2))
UNION
select jmeno3 as jmeno, prijmeni3 as prijmeni FROM tabulka
        WHERE jmeno3 LIKE '$pismenko%' OR prijmeni3 LIKE '$pismenko%'
        GROUP BY (SELECT concat(jmeno, ' ', prijmeni3))
";

$navrat=mysql_db_query(.....);

 while (list($jmeno, $prijmeni) = mysql_fetch_row($navrat)){
 echo ("$jmeno $prijmeni</br>");

}

}

Případně existuje nějaký jiný zápis pro výpis?

Editováno 15.7.2015 19:17
 
Nahoru Odpovědět
15.7.2015 19:15
Avatar
shaman
Člen
Avatar
Odpovídá na Lucyk
shaman:16.7.2015 0:27

wau, to mysql_db_query mas odkial? Vsak to je stara funkcia ako Lenin. Uz od verzie 5.3 sa neodporuca pouzivat. Precitaj si nieco o PDO kniznici ale iste si najdi nieco ine na SQL.
Ten koniec by som dobojoval asi takto:

// vykonaj sql prikaz
$navrat = mysql_query($co, $spojeni);

// ak je problem s sql tak daj vediet aky.
if ($navrat === false) {
  echo mysql_error();
}

// cyklus na vypis
while ($riadok = mysql_fetch_assoc($navrat)) {
    echo $riadok['jmeno']." ".$riadok['prijmeni'];
}

Daj vediet ci pomohlo, alebo mas dalsi error. A tiez odkial mas to mysql_db_query?

Nahoru Odpovědět
16.7.2015 0:27
try {...} catch (Exception ignored) { echo " ¯\_(ツ)_/¯ "; }
Avatar
Odpovídá na shaman
Dominik Gavrecký:16.7.2015 0:28

Samotné mysql by sa už nemalo používať !!!

Nahoru Odpovědět
16.7.2015 0:28
Hlupák nie je ten kto niečo nevie, hlupákom sa stávaš v momente keď sa na to bojíš opýtať.
Avatar
Lucyk
Člen
Avatar
Odpovídá na shaman
Lucyk:16.7.2015 1:15

Tak se mi podařilo dopátrat se, co znamela chybová hláška a měla jsem překlep v názvu tabulky. Tvůj kód mi už vypisuje, co potřebuji, a ještě se snažím do něj napasovat, aby mi výsledky řadil podle abecedy.

Tzn.:
Horak Adam
Horak Jiri
Kraj Jiri
Kopr Emil
Kopr Zdenek
.... atd.

Zkoušela jsem různé varianty ODER BY co mě napadly, ale žádná se mi nepodařila rozchodit.

Nyní používám:

$sql = "
select jmeno1 as jmeno, prijmeni1 as prijmeni FROM tabulka
        WHERE prijmeni1 LIKE '$pismenko%'
        GROUP BY (SELECT concat(prijmeni1, ' ', jmeno1))
UNION
select jmeno2 as jmeno, prijmeni2 as prijmeni FROM tabulka
        WHERE prijmeni2 LIKE '$pismenko%'
        GROUP BY (SELECT concat(prijmeni2, ' ', jmeno2))
UNION
select jmeno3 as jmeno, prijmeni3 as prijmeni FROM tabulka
        WHERE prijmeni3 LIKE '$pismenko%'
        GROUP BY (SELECT concat(prijmeni3, ' ', jmeno3))
";
 
Nahoru Odpovědět
16.7.2015 1:15
Avatar
Lucyk
Člen
Avatar
Lucyk:17.7.2015 3:59

Tak se mi už podařilo to řazení tam dostat, měla jsem překlep v předpisu.

Ještě bych měla dotaz vztahující se k výpisu

echo ("$jmeno $prijmeni</br>");

Jak by se měl výpis doplnit, aby při vypsaném jménu a příjmení bylo možné na něj kliknout a provedl se dotaz výpis z databáze na všechny položky obsahující toto jméno a příjmení?

 
Nahoru Odpovědět
17.7.2015 3:59
Avatar
smiesek
Člen
Avatar
Odpovídá na Lucyk
smiesek:17.7.2015 13:40

netuším, jakým způsobem máš jednotlivé záznamy, ale předpokládám, že na to půjdeš nějak takhle:

1. rozšířit výpis názvu o aktivní odkaz (a)

echo ("<a href=\"vypis.php?jp='.$jmeno $prijmeni.'\">'.$jmeno $prijmeni.'</br>");

kdyžtak si uprav nějak pořadí uvozovek složených a jednoduchých, aby Ti to nevypisovalo chybu, tomuto já neholduju ;-(

2. sestavit si SQL dotaz, co a jak budeš chtít vypisovat, je hlavní si uvědomit, že budeš pracovat s proměnnýma $jmeno $prijmeni, takže na ty se budeš v dotazu odvolávat a budou v podmínce, takže to bude něco jako

WHERE jmeno1 LIKE '$jmeno' AND prijmeni1 LIKE '$prijmeni'

...

3. pak ještě si vytvoříš předávání parametru:

if (isset($_GET['jp']))

v tomto případě jp, nebo jak si to pojmenuješ je na Tobě, u toho budeš testovat, pokud byl předaný, jako že ano bude tak do něj právě uložíš ty proměnné $jmeno a $prijmeni, které se budou odvolávat do SQL dotazu, aby Ti to vypsalo to, co potřebuješ

Tak zkus tvořit, je to nástin postupu a následně budeme dolaďovat úpravy dle konkrétních požadavků ;-)

Editováno 17.7.2015 13:42
 
Nahoru Odpovědět
17.7.2015 13:40
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 10.