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í.

Diskuze: MySQL - INSERT.. SELECT

Aktivity
Avatar
Pavel Vosyka
Člen
Avatar
Pavel Vosyka:13.1.2013 23:33

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" (updated 10 years after: "Není nic špatného na tom napsat něco 2x")
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Pavel Vosyka
David Hartinger:14.1.2013 10:37

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

Nahoru Odpovědět
14.1.2013 10:37
New kid back on the block with a R.I.P
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Pavel Vosyka
David Hartinger:14.1.2013 10:39

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
New kid back on the block with a R.I.P
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Pavel Vosyka
Kit:14.1.2013 10:58

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
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:14.1.2013 11:07

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" (updated 10 years after: "Není nic špatného na tom napsat něco 2x")
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Pavel Vosyka
Kit:14.1.2013 12:39

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
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:14.1.2013 14:32

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" (updated 10 years after: "Není nic špatného na tom napsat něco 2x")
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Pavel Vosyka
Kit:14.1.2013 15:04

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:20.1.2013 16:13

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" (updated 10 years after: "Není nic špatného na tom napsat něco 2x")
Avatar
Don
Člen
Avatar
Odpovídá na Pavel Vosyka
Don:20.1.2013 16:27

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:21.1.2013 11:22
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" (updated 10 years after: "Není nic špatného na tom napsat něco 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.