Группировка полей из разных таблиц

Sandr

Новичок
Группировка полей из разных таблиц

Есть три таблицы
список работ dp_gallery (id, text)
список файлов dp_gallery_img (id, pid, filename, watermark)
список ключевых слов dp_tags (id, word)

PHP:
SELECT g.*,  
group_concat(DISTINCT i.filename) AS filename,  
group_concat(i.watermark) AS watermark, 
group_concat(DISTINCT w.word) as keywords  
FROM dp_gallery AS g  
LEFT JOIN dp_gallery_img AS i ON i.pid = g.id  
LEFT JOIN dp_tags AS w ON w.id = ANY (SELECT tagId FROM dp_tags_links WHERE gid=g.id AND tbl='_gallery')  
WHERE g.id = ANY (SELECT gid FROM dp_menu_gallery_links WHERE mid=38)  
GROUP BY g.id  ORDER BY RAND()  LIMIT 0,1
При таком запросе поле watermark имеет количество записей равное количеству filename умноженному на количество keywords
Пример
g.id = 2
g.text = блабла
filename = "file1, file2, file3"
watermark = "center,empty,center,center,empty,center,center,empty,center,center,empty,center"
keywords = "word1, word2, word3, word4"

если добавить DISTINCT в часть -
PHP:
group_concat(DISTINCT i.watermark) AS watermark
то поле watermark групируется по схожим словам и выходит
g.id = 2
g.text = блабла
filename = "file1, file2, file3"
watermark = "center,empty"
keywords = "word1, word2, word3, word4"

------------------------
Как получить список watermark равный по количеству filename?
 

Gas

может по одной?
Я бы сделал примерно так:
Код:
SELECT group_concat(w.word), t.*
FROM 
(
 SELECT group_concat(i.filename), group_concat(i.watermark), ...
 FROM dp_gallery ...
 LEFT JOIN dp_gallery_img ...
 WHERE ... GROUP BY ... ORDER BY ... LIMIT ...
) AS t
LEFT JOIN dp_tags ON t.id = ...
GROUP BY t.id
и "= ANY (SELECT ..." всё таки бы заменил на join, есть у mysql проблемы с сorrelated subqueries, правда в 5.4 вроде уже fixed.
 

Sandr

Новичок
Спасибо
вышло так
PHP:
SELECT group_concat(w.word) AS keywords, group_concat(w.id) AS wid, t.*
FROM 
(
	SELECT 
	g.*, 
	group_concat(i.filename) AS filename, 
	group_concat(i.watermark) AS watermark, 
	group_concat(i.master) AS master
	FROM dp_gallery AS g
	LEFT JOIN dp_gallery_img AS i ON i.pid = g.id
	WHERE g.id = ANY (SELECT gid FROM dp_menu_gallery_links WHERE mid=38) 
	GROUP BY g.id 
	ORDER BY RAND() 
	LIMIT 0,3
) AS t
LEFT JOIN dp_tags AS w ON w.id = ANY (SELECT tagId FROM dp_tags_links WHERE gid=t.id AND tbl='_gallery') 
GROUP BY t.id
 
Сверху