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í.
Mezi 13:00 až cca 16:00 proběhne odstávka sítě z důvodu aktualizace. Web bude po celou dobu nedostupný.

Diskuze: SELECT pro adresni stitky

Aktivity
Avatar
Mirek Šalamon:20.12.2018 0:29

Zdravim, potrebuju vytvorit dotaz pro adresni stitky, kde na jednu adresu posilam vice balicku. resp. jedna zasilka se sklada z vice baliku napriklad 5. a ja potrebuju vedet ze mam stitek 1 z 5, 2 z 5, 3 z 5...

jak vytvorim takovy select, aby mi zdupliikoval adresu tolikrat kolikrat potrebuji a navic doplnil i poradi toho stitku.

tabulka adresa:

pepa

franta

jana

Tabulka pocet ballku:

3

2

5

potreebuju vysledek Selectu:

pepa 1 3

pepa 2 3

pepa 3 3

franta 1 2

franta 2 2

jana 1 5

jana 2 5

jana 3 5

jana 4 5

jana 5 5

 
Odpovědět
20.12.2018 0:29
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:20.12.2018 8:23

Domaci ukol? A tabulku 3 mas kde, ktera definuje propojeni?

tab1 (id_adresa, adresa)
tab2 (id_balik, balik)
tab3 (id_balik, id_adresa)

SELECT
    tab1.balik,
    tab2.adresa,
    COUNT(tab3.id_adresa) AS pocet
FROM
    tab3
    LEFT JOIN tab1 ON tab1.id_balik=tab3.id_balik -- u toho ON mozna nejdriv tab3, pak tab1, pokud to nebude fungovat
    LEFT JOIN tab2 ON tab2.id_balik=tab3.id_balik
Editováno 20.12.2018 8:24
 
Nahoru Odpovědět
20.12.2018 8:23
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:20.12.2018 8:35

Mno, ale jestli to mas jen takhle, tak to je celkem nic moc reseni. S tim se moc operovat neda.

tab1 (id_adresa, adresa)
tab2 (id_adresa, pocet)

Asi bys musel udelat nejakou proceduru, ktera vygeneruje pro kazdy pocet individualni radek do temp tabulky a tu pak vratis uzivateli.
google = procedure clone row by cause
google = mysql procedure cycle cause example

 
Nahoru Odpovědět
20.12.2018 8:35
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:20.12.2018 8:56

Mohlo by to byt neco takoveho. Ale nikdy jsem to nedelal, tak jen upravuji, co jsem nasel :)

DECLARE  #temp_table(
  id_adresa INT,
  balik_cislo INT
 )
SET @i = 1
SET @numrows = (SELECT COUNT(*) FROM tab2)
IF @numrows > 0
    WHILE (@i <= @numrows)
    BEGIN
        SET @id_adresa = (SELECT id_adresa FROM  tab2 LIMIT @i,1)
        SET @pocet     = (SELECT pocet FROM  tab2 LIMIT @i,1)
        SET @j = 1
        IF @pocet  > 0
          WHILE (@j <= @pocet )
             BEGIN
                INSERT INTO temp_table (id_adresa, balik_cislo) VALUES (@id_adresa, @j)
                SET @j = @j + 1
             END
        SET @i = @i + 1
    END
SELECT FROM #temp_table LEFT JOIN... --- a select, kterym pak najoinujes udaje adres podle id

google = sql procedure foreach row
https://forums.asp.net/t/1207630.aspx?…

Urcite to jde i mene krkolomne, ale takovehle konstrukce nepouzivam, tak ti moc neporadim.

Editováno 20.12.2018 8:56
 
Nahoru Odpovědět
20.12.2018 8:56
Avatar
Mirek Šalamon:20.12.2018 19:24

Tak nakonec jsem to vyresil nasloedovne:
zalozim novou tabulku max_baliku s max cislem poctu stitku treba 100 (tolik jich nikdy nebude) a pouziju to v joinu:

SELECT adresy.ADRESA, max_baliku.PORADI, pocet_baliku.POCET FROM adresy
LEFT JOIN pocet_baliku ON pocet_baliku.CISLO_ZASILKY = adresy.CISLO_ZASILKY
LEFT JOIN max_baliku ON max_baliku.PORADI <= pocet_baliku.POCET

dulezite je to <= v poslednim joinu, to pak udela presne to co potrebuju. doda duplicitni radky vcetne poradi

Editováno 20.12.2018 19:26
 
Nahoru Odpovědět
20.12.2018 19:24
Avatar
Mirek Šalamon:20.12.2018 20:42

jen upresnim, ze tabulka max_baliku obsahuje 100 radku (1-100) nikoli jen jedine cislo 100.

 
Nahoru Odpovědět
20.12.2018 20:42
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:21.12.2018 7:45

Sikovne.

 
Nahoru Odpovědět
21.12.2018 7:45
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 7 zpráv z 7.