Avatar
Pavel Vosyka
Člen
Avatar
Pavel Vosyka:

Ahoj,
zas nevím jak správně vytvořit dotaz a už se s tím dost dlouho morduji. Nejjednoduší by bylo rozdělit požadavek na dva dotazy a s tím, že výsledek z prvního dotazu(f_album_id) použiji v dotazu druhém. Lepší by ale bylo míti jen jeden.

Takže:

INSERT INTO f_album (f_user_id, name, url)
VALUES ('1', 'Albumicko', 'albumicko');
# vložím album (samo se mu přiřadí ID)

SELECT f_album_id AS faid
FROM f_album
WHERE f_user_id = '1' AND url = 'albumicko'
LIMIT 0,1;
# zjistím id toho alba, a uložím ho jako alias

INSERT INTO f_photo (f_album_id, name)
VALUES  (faid, 'fotka1.jpg'),
        (faid, 'fotka2.jpg');
# a tady bych chtěl vložit a použít ten výsledek z toho SELECTu

Jenže to nejde protože ALIASy zřejmě fungují v rámci toho jednoho příkazu. Dá se to udělat takhle:

# vložím album (samo se mu přiřadí 'f_album_id')
# a použiji INSERT..SELECT
INSERT INTO f_photo (f_album_id, name)
SELECT f_album_id, 'fotka1.jpg'
FROM f_album
WHERE f_user_id = '1' AND url = 'albumicko'
LIMIT 0,1;

Tohle funguje, jenže jen pro jednu fotku... a já jich potřebuju vložit třeba 250.

Teoreticky by to šlo udělat takhle, ale je to prasárna největší..

# pro 1. fotku
INSERT INTO f_photo (f_album_id, name)
SELECT f_album_id, 'fotka1.jpg'
FROM f_album
WHERE f_user_id = '1' AND url = 'albumicko'
LIMIT 0,1;
# pro 2. fotku
INSERT INTO f_photo (f_album_id, name)
SELECT f_album_id, 'fotka2.jpg'
FROM f_album
WHERE f_user_id = '1' AND url = 'albumicko'
LIMIT 0,1;
# pro 3. 4. 5. ... fuj

Je asi jasné proč to nechci použít, to už by bylo lepší to rozdělit na dva dotazy jak jsem psal v úvodu... Co s tím? Proč nefunguje tohle?

INSERT INTO f_photo (f_album_id, name)

SELECT f_album_id AS faid
FROM f_album
WHERE f_user_id = '1' AND url = 'albumicko'
LIMIT 0,1;

VALUES (faid, fotka1.jpg),
       (faid, fotka2.jpg),
       (faid, fotka3.jpg),
 ... ;
# tak by se mi to líbilo...

Tož jsem zvědav co vymyslíte .. případně, kdyby se ta hodnota ze SELECTu dala uložit do nějaké proměnné a ta pak použít v tom INSERT .. VALUES (var,'fotka), .. jenže ty SQL proměnné jsem nějak nepobral.. Díky

Editováno 13.1.2013 23:34
Odpovědět 13.1.2013 23:33
"nikdy nepiš nic 2x"
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Pavel Vosyka
David Čápka:

Podívej se na kapitolu s poddotazy v MySQL seriálu ;-)

Nahoru Odpovědět 14.1.2013 10:37
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Pavel Vosyka
David Čápka:

Jinak kdybys nám vysvětlil co chceš dělat místo těch divných dotazů, tak bych ti i pomohl, ale tohle se mi luštit nechce.

Nahoru Odpovědět 14.1.2013 10:39
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Kit
Redaktor
Avatar
Odpovídá na Pavel Vosyka
Kit:

Nezkoušel jsem to, ale mohlo by to fungovat:

INSERT INTO f_photo (f_album_id, name)

SELECT * FROM
   (SELECT f_album_id FROM f_album
      WHERE f_user_id = '1' AND url = 'albumicko'
      LIMIT 0,1
   ) as album,
   (SELECT "fotka1.jpg" UNION ALL
    SELECT "fotka2.jpg" UNION ALL
    SELECT "fotka3.jpg") as fotka;
Nahoru Odpovědět  +1 14.1.2013 10:58
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Pavel Vosyka
Člen
Avatar
Pavel Vosyka:

To jsem samozřejmě koukal ... ale chybí mi tam, právě jak tam píše Kit, dotaz typu INSERT ... SELECT

Nahoru Odpovědět 14.1.2013 11:07
"nikdy nepiš nic 2x"
Avatar
Kit
Redaktor
Avatar
Odpovídá na Pavel Vosyka
Kit:

INSERT ... SELECT používám zejména když potřebuji transakčně vložit více záznamů, protože standardní INSERT ... VALUES umí vložit jen jeden záznam.

Nahoru Odpovědět  +1 14.1.2013 12:39
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Pavel Vosyka
Člen
Avatar
Odpovídá na Kit
Pavel Vosyka:

Kite, jseš geniální. Ten tvůj dotaz funguje přesně jak chci... akorát mu úplně nerozumím. Hodilo by se k těm SQL článkům dopsat UNION, UNION ALL nebo další o kterých ještě ani nevím. Na netu o tom najdu informace buď v angličtině, kde jsou schované v obrovských dotazech, ve kterých se ztrácím a nebo na českých třeba 13 let starých. Díky.

Nahoru Odpovědět 14.1.2013 14:32
"nikdy nepiš nic 2x"
Avatar
Kit
Redaktor
Avatar
Odpovídá na Pavel Vosyka
Kit:

Díky za uznání. Trvalo mi dost dlouho, než jsem na tyto a podobné vychytávky přišel a začal používat SQL jako normální programovací jazyk.

Nahoru Odpovědět 14.1.2013 15:04
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Pavel Vosyka
Člen
Avatar
Pavel Vosyka:

Kite, věděl bys jak do toho ještě zapojit podmínku, podmínku aby se záznam nevytvářel, když už tam takový záznam je, tím myslím záznam, který by měl stejné "f_album_id" a "f_photo.name"? Přičemž f_photo.name nemůže být unikátním sloupcem (ale unikátním ve výběru těch co mají dané "f_album_id")

... nebo možná to udělám úplně jinak... vytáhnu si zapsaná data z DB a porovnám s těmi co chci zapsat, a až pak budu zapisovat... Hold ještě neumím používat SQL jako programovací jazyk :-/

Nahoru Odpovědět 20.1.2013 16:13
"nikdy nepiš nic 2x"
Avatar
Don
Člen
Avatar
Odpovídá na Pavel Vosyka
Don:

Netestuj to. Pokud tam již data jsou, databáze by to měla odmítnout. Zbytečně to jen zpomaluje

 
Nahoru Odpovědět 20.1.2013 16:27
Avatar
Pavel Vosyka
Člen
Avatar
Pavel Vosyka:
INSERT INTO f_photo (f_album_id, name)
SELECT * FROM
(SELECT f_album_id AS faid FROM f_album
 WHERE f_user_id = '1' AND url = 'pokus'
 LIMIT 0,1) as faid,
(SELECT 'fotka1.jpg' as faname) as fotka
WHERE NOT EXISTS (SELECT * FROM f_photo WHERE f_album_id = faid AND name = faname);

Tohle funguje jak chci - nevloží to fotku, když tam již existuje takový záznam. Nevím jak do toho ale zapojit UNION/UNION ALL, abych to mohl udělat pro více fotek. Abych negeneroval dotaz pro každou fotku zvlášť.

Nahoru Odpovědět 21.1.2013 11:22
"nikdy nepiš nic 2x"
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 11 zpráv z 11.