SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 23.01.2011 15:41:27

russssss
Участник
Зарегистрирован: 02.12.2010
Сообщений: 9

Вывести по одной записи из найденных

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

Неактивен

 

#2 25.01.2011 00:42:14

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Вывести по одной записи из найденных

К сожалению, хорошего варианта нет — Вы хотите с одной стороны взять
одну строку из таблицы, а с другой стороны — посчитать количество этих
строк. Выбросите одно из условий в другой запрос — и сразу напишете
хорошо работающие.

В качестве костыльного решения можете попробовать написать через под-
запросы. Что-нибудь в таком духе:
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

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson