MYSQL Join проблем

alkin

Registered
Здравейте, имам следния проблем имам 2 таблици articles и images
в таблица articles имам новини a в таблица images се пазят снимките към новините, като условието е една новина може да има няколко снимки.
Имам и следната заявка:

[sql] SELECT * FROM articles as a INNER JOIN images as img ON a.id=img.article_id WHERE a.category='1'[/sql]

Тази заявка ми връща всички статии от категория с id 1 и всички снимки към тези статии. Ако обаче една статия има повече от 1 снимка заявката ще върне една статия няколко пъти или по-точно ще върне една статия колкото са снимките към нея и всичко е ок и този резултат ме удовлетворява, но ако променя малко заявката :

[sql] SELECT * FROM articles as a INNER JOIN images as img ON a.id=img.article_id WHERE a.category='1' LIMIT 5[/sql]

Тогава идват и проблемите.
Резултатът е неудовлетворителен защото ако последните 5 статии имат по няколко снимки то тогава ми връща примерно ако първата статия има 2 снимки а втората 3 снимки
първата статия 2 пъти а втората статия 3 пъти, аз аз искам да ми върне последните 5 статии и техните снимки.
Може ли някой да ми помогне със съвет.[/php]
 
А какво ще се случи с новините, които нямат снимки? Така дефинирана заявката с INNER JOIN ще получиш пълно съответствие по зададения ключ или с други думи - новина без снимка няма да излезе въобще.

Още нещо за заявката - недейте да селектвате така със звездичка, особенно когато става въпрос за свързани заявки. Избройте си полетата които ще използвате и им задайте уникални имена (алиаси), чрез които да достъпвате по-късно данните.

И сега за проблема - имаш връзка едно към много. Имаш два подхода според случая. Не става ясно как са запазени снимките в базата - като имена на файлове или самите файлове са в базата (което е лош вариант). За първия случай може да направиш следното:

[sql]SELECT a.title, group_concat(img.filename) as images FROM articles as a INNER JOIN images as img ON a.id=img.article_id WHERE a.category='1' group by a.id[/sql]

Това ще ти върне за всяка новина (със снимка) по един запис, като в алиаса 'images' ще имаш изброени имената на всички снимки, разделени със запетайки.

Втори подход - картинките ти са в базата. Тогава е ясно - махаш връзката към таблицата с картинките от основната заявка, а при извъртането на резултата - пускаш серия от подзаявки, които да ти върнат снимките за всяка една новина.
 
Заявката, която пиша е примерна за да не губим време. Много благодаря за отговора и това group_concat ми решава всички главоболия. По принцип всяка новина има снимка тоест админа не може да добави статия без снимка за това съм го направил с inner join а в таблица images пазя само пътя до снимките и разбира се селекта ми не е с * .
Благодаря много.
 
GROUP BY or ORDER BY on different tables
This will force the use of a temporary table and filesort, which can be a huge performance problem and can consume large amounts of memory and temporary space on disk.
Rule ID: CLA.006

При анализ на заявката ми пише този advice
 

Back
Горе