Diskuze: MySQL dva slupce se stejným jménem z různých tabulek

Člen

Zobrazeno 10 zpráv z 10.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
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
.
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ěď.
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
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:
//A teď fakt nevím..
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...
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.
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
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
.
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
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.
Zobrazeno 10 zpráv z 10.