Black friday Black friday
Aprílový black friday tě nenechá v klidu! Až 80 % prémiového obsahu zdarma. Více informací

Diskuze: SELECT pro adresni stitky

PHP PHP SELECT pro adresni stitky American English version English version

Aktivity (1)
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  +1 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.