Задавайте вопросы, мы ответим
Вы не зашли.
SELECT *,B.id AS Bid, COUNT(DISTINCT C.pid) Ccount FROM places AS A
LEFT JOIN place_review AS B ON A.id=B.pid
LEFT JOIN place_photos AS C ON B.id=C.cid
GROUP BY A.id,B.id ORDER BY A.id DESC,COUNT(DISTINCT C.cid) DESC LIMIT 10
Словами: Выбираю тему записи (places), ищу комментарии (place_review), ищу фото к комментариям (у каждого комментария свои фото, place_photos), теперь мне надо выводить название с одним комментарием у которого есть приемущество (наличие фоток, place_photos). Все по этому запросу так и получается, но выводится несколько раз одна и та же тема, если у каждого коммента к теме есть фото, а нужно всего раз у каждой темы брать комментарий с приемуществом (наличие фото).
SELECT DISTINCT A.id работает, но перестает работать при добавлении C.photo, а при добавлении B.about (текст комментария) мускул уходит в небытие
Пожалуйста помогите решить.
Explain
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE A ALL \N \N \N \N 12404 Using temporary;; Using filesort
1 SIMPLE B ref pidgid;NewIndex1;NewIndex3 pidgid 4 tab.A.id 1
1 SIMPLE C ref NewIndex4 NewIndex4 4 tab.B.id 19
CREATE TABLE `places` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`place` VARCHAR(255) NOT NULL DEFAULT '',
...
PRIMARY KEY (`id`,`place`),
UNIQUE KEY `NewIndex1` (`id`)
) ENGINE=INNODB AUTO_INCREMENT=12658 DEFAULT CHARSET=cp1251
CREATE TABLE `place_review` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`pid` INT(11) NOT NULL,
`gid` INT(11) NOT NULL,
`about` TEXT,
...
PRIMARY KEY (`id`),
KEY `pidgid` (`pid`,`gid`),
KEY `NewIndex1` (`pid`),
KEY `NewIndex2` (`id`,`pid`),
KEY `NewIndex3` (`pid`,`id`)
) ENGINE=MYISAM AUTO_INCREMENT=12577 DEFAULT CHARSET=cp1251
CREATE TABLE `place_photos` (
`pid` INT(11) NOT NULL,
`cid` INT(11) NOT NULL,
...
`photo` VARCHAR(100) DEFAULT NULL,
...
UNIQUE KEY `NewIndex3` (`pid`,`photo`),
KEY `NewIndex1` (`photo`),
KEY `NewIndex2` (`pid`),
KEY `NewIndex4` (`cid`),
KEY `NewIndex5` (`pid`,`cid`)
) ENGINE=MYISAM DEFAULT CHARSET=cp1251
Неактивен
К сожалению, хорошего варианта нет — Вы хотите с одной стороны взять
одну строку из таблицы, а с другой стороны — посчитать количество этих
строк. Выбросите одно из условий в другой запрос — и сразу напишете
хорошо работающие.
В качестве костыльного решения можете попробовать написать через под-
запросы. Что-нибудь в таком духе:
SELECT A.*, (SELECT B.id FROM B WHERE (A<->B) ORDER BY IF(EXISTS(SELECT C.id FROM C WHERE (B<->C), 1, 0)) DESC LIMIT 1 )
FROM A
Неактивен