Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
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 dva slupce se stejným jménem z různých tabulek

Aktivity
Avatar
Pavel Vosyka
Člen
Avatar
Pavel Vosyka:4.1.2013 13:46

Zdravím,
dávám dohromady dotaz, bude ještě větší a musím ho optimalizovat, naskytl se ale problém.

$dotaz = "
SELECT foto_album.PAT­H,foto_album.NA­ME, foto_pict.NAME
FROM users, foto_album, foto_pict
WHERE users.nick = '$userLogin'
AND foto_album.USER_ID = users.id
";

V PHPku to pak vytahuju například takhle:

while ($row = mysql_fetch_as­soc($navrat)){
echo "Cesta k albu je $row['PATH'] a jeho název je $row['NAME'] a název obrázku je $row['NAME']
}

A to samozřejmě nefunguje tak jak chci. Jak mám výsledek vybrat? Nebo musím měnit název sloupce (nebo mu dát nějaký prefix)?

Potřeboval bych kdyby šlo vybírat: $row['název_ta­bulky.jeho_slou­pec']; jenže to nejde :(.

Díky.

Odpovědět
4.1.2013 13:46
"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:4.1.2013 14:02

Přejmenuj si ty sloupečky:

SELECT foto_album.PATH as album_path, foto_album.NAME AS album_name, foto_pict.NAME AS pict_name ...

A nepoužívej kartézský součin. Extrémně to zatěžuje databázi. Použij raději JOIN.

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

No jó, pravda, těmi aliasy bych si pomohl.. aspoň se je naučím používat. JOIN právě zkouším. Díky za rychlou odpověď.

Nahoru Odpovědět
4.1.2013 14:06
"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:4.1.2013 14:22

Někdy se těm aliasům nedá vyhnout

SELECT adddate(now(), INTERVAL -1 YEAR) AS vloni;

... a můžeš vydávat pasy a občanky i 29. února 2012 :)

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

:) Hele, tak už jsem ten dotaz upravil ale potřebuju poradit s limitem:

Asi bude lepší když napíšu co chci aby to dělalo:

  1. inputem je přezdívka
  2. Z tabulky 'users' dostanu podle prezdivky => 'USERS ID' a 'JMENO'
  3. Z tabulky 'albums' dostanu podle získaného 'USERS ID' => 'ALBUMS ID', 'NAME', 'PATH' a 'PREW'

    //A teď fakt nevím..

  4. Z tabulky 'photos' potřebuju dostat n-tý záznam ze sloupce 'PICT', u kterého se 'ALBUMS ID' rovná již získanému 'ALBUMS ID' a zárověň tím N je hodnota PREW získaná z tabulky 'albums'

V tabulkách jsou data asi takhle:

- users
USERS_ID Jmeno  Nick
4        Pavel  vosa
8        Michal misa
- albums
ALBUMS_ID USERS_ID NAME     PATH  PREVIEW (n-tá fotka jako náhled)
1         4        Kytičky  http  3
2         4        Voda     http  1
3         4        Stromy   http  0
4         8        Kočka    http  1
- photos
PHOTOS_ID ALBUMS_ID PICT
1         1         01.JPG
2         1         02.JPG
3         1         03.JPG
4         1         04.JPG
5         2         01.JPG
6         2         02.JPG
7         3         01.JPG
8         3         02.JPG
9         3         03.JPG
10        4         01.JPG
11        4         02.JPG
12        4         03.JPG

Na příkladu vynechám aliasy, takhle mi to funguje až do bodu 3, s tím 4. si nevím rady. N-tý (třeba pátý) záznam dostanu takhle: LIMIT 4,1. Jenže nevím jak to udělat aby se ten LIMIT vztahoval jen na ten výběr z PICT a né na celek.

SELECT users.JMENO, albums.NAME, albums.PATH, albums.PREVIEW
FROM albums
JOIN users ON albums.USER_ID = users.ID
WHERE users.NICK = '$userLogin'

Výstup bych si představoval nějak takhle:
pro (vosa):

Pavel Kytičky http 04.jpg
Pavel Voda    http 02.jpg
Pavel Stromy  http 01.jpg

Kdo mi poradí (já se s tím trápím celý den) dostane ode mne velké bezvýznamné i++;

A to s tím n-tým výběrem (LIMIT n, 1) by bylo dobré k limitům dopsat...

Editováno 4.1.2013 15:32
Nahoru Odpovědět
4.1.2013 15:29
"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:4.1.2013 16:01
SELECT users.JMENO, albums.NAME, albums.PATH, albums.PREVIEW, photos.PICT
   FROM albums
   JOIN users ON albums.USER_ID = users.ID
   WHERE users.NICK = '$userLogin'
   JOIN photos USING(ALBUMS_ID);

Bylo by vhodné změnit albums.PREVIEW na albums.PHOTOS_ID. Jinak to nepůjde rozumně udělat.

Pro další práci doporučuji všechny názvy tabulek a sloupců převést do jednotného čísla a psát je malými písmeny.

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

Pořád to zkouším, hledám co dělám špatně.. ale píše mi to chybu v podledním řádku. zkoušel jsem místo USING dát ON photos.ALBUMS_ID = albums.ALBUMS_ID, ale to samé.

Jinak máš pravdu, asi to tak budu muset udělat, nechtěl jsem to kvůli tomum, že takhle bych mohl nechat jednoduše 0 jako výchozí a tím by byla první fotka... názvy už jsem přepsal(ale tady už to tak nechám, ať v tom není bordel), díky

Nahoru Odpovědět
4.1.2013 17:04
"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:4.1.2013 17:13
USING(ALBUMS_ID)

je skutečně to samé jako

ON photos.ALBUMS_ID = albums.ALBUMS_ID

Používání USING je podle mne jediný rozumný důvod, proč používat albums.ALBUMS_ID místo kratšího albums.ID.

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

Tak už mi to funguje: (tabulku users zatím přejmenovat nemůžu)

SELECT users.jmeno, album.path, photo.name
FROM photo
JOIN users ON users.nick = '$userNick'
JOIN album ON users.id = album.user_id
WHERE album.photo_id = photo.photo_id

Nevím jestli je to možné, ale myslím, že chyba je v JOIN => WHERE => JOIN ... napadá mě, že po WHERE již JOIN následovat nemůže.. ale možná kecám hlouposti (jinak si to ale nedovedu vysvětlit) Díky

Nahoru Odpovědět
4.1.2013 17:38
"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:4.1.2013 17:58
SELECT users.jmeno, album.path, photo.name
   FROM album
   JOIN users ON users.id = album.user_id
   JOIN photo ON album.photo_id = photo.photo_id
   WHERE users.nick = '$userNick';

Za ON by měly být pouze podmínky, které se týkají aktuálního spojení tabulek. Selekce uživatele se dělá až za WHERE. Neboj se, databáze si to sama přeskupí tak, aby to bylo efektivní. Provádí se to v jiném pořadí, než v jakém je to napsáno.

Nahoru Odpovědět
4.1.2013 17:58
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
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.