Не срабатывает LEFT JOIN

Kotofeich

Новичок
Не срабатывает LEFT JOIN

Помогите в написании sql-запроса.
Вроде все примитивно, но не могу понять в чем моя ошибка.
Есть три таблицы: статьи, теги, и связующая теги со статьями.
Вот они подробнее:
tags (поля id и tagname)
tags_reffer (поля idarticle и idtag)
content (поля id и hits)

Моя задача получить все теги, и при этом вычислить hits (колл-во просмотров статей).
Я написал такой запрос:
PHP:
SELECT t.tagname, sum(c.hits) as hits FROM  tags as t 
LEFT JOIN tags_reffer as r, content as c ON t.id=r.idtag and r.idarticle=c.id GROUP BY t.id
В результате он не срабатывает. Помогите пожалуйста найти ошибку.
 

Krishna

Продался Java
1. таблицу надо присылать в виде дампа структуры, а так же тестового набора данных
2. количество пишется с одной л
3.
В результате он не срабатывает. Помогите пожалуйста найти ошибку.
Ошибка в том, что он "не срабатывает".
Как хочешь так и понимай, пока так же задаешь вопрос.
 

Kotofeich

Новичок
Хорошо.
Вот дамп

CREATE TABLE `tags` (
`id` int(11) NOT NULL auto_increment,
`tagname` varchar(35) NOT NULL default '',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ;

INSERT INTO `tags` VALUES (1, 'проверка');
INSERT INTO `tags` VALUES (2, 'тест2');
INSERT INTO `tags` VALUES (3, 'тестирование');


CREATE TABLE `tags_reffer` (
`idarticle` int(11) NOT NULL default '0',
`idtag` int(11) NOT NULL default '0'
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

CREATE TABLE `content` (
`id` int(11) unsigned NOT NULL auto_increment,
`title` varchar(255) NOT NULL default '',
`introtext` mediumtext NOT NULL,
`fulltext` mediumtext NOT NULL,
`hits` int(11) unsigned NOT NULL default '0',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

Таблица tags_reffer и content пустые. Если они заполнены то sql запрос работает корректно.
 

Kotofeich

Новичок
Большое-большое спасибо!

-~{}~ 21.04.08 21:05:

Написал так:

SELECT t.tagname, sum(c.hits) as hits FROM tags as t
LEFT JOIN (tags_reffer as r, content as c) ON (t.id=r.idtag AND r.idarticle=c.id) GROUP BY t.id

В итоге запрос исполнился, но вернул пустой массив. Хотя должен был вроде как вернуть записи из таблицы tags.
 

Gas

может по одной?
Kotofeich
не, не правильно ты понял. Пиши 2 раза left join, а об объединении через запятую вообще забудь.
 

Kotofeich

Новичок
Автор оригинала: Gas
Kotofeich
не, не правильно ты понял. Пиши 2 раза left join, а об объединении через запятую вообще забудь.
Я запутался.. Ты сам в примере написал через запятую..
А дважды LEFT JOIN это так?:

SELECT t.tagname, sum(c.hits) as hits FROM tags as t
LEFT JOIN tags_reffer as r LEFT JOIN content as c ON (t.id=r.idtag AND r.idarticle=c.id) GROUP BY t.id

Попробовал еще так

SELECT t.tagname, sum(c.hits) as hits FROM tags as t
LEFT JOIN (tags_reffer as r INNER JOIN content as c) ON (t.id=r.idtag AND r.idarticle=c.id) GROUP BY t.id

Результат один и тот же - неправильно записанный запрос.

-~{}~ 21.04.08 21:23:

Все я разобрался. Спасибо.
 

Gas

может по одной?
Ты сам в примере написал через запятую..
я просто написал как mysql понимает твой изначальный запрос, там же видно что он работать не будет. Хотел было пояснить, но ты уже написал "большое спасибо".
Главное разобрался и хорошо, а запятая это зло :)
 

Krishna

Продался Java
блин, забыл про человека)

основная мысль была - запрос надо строить постепенно, если не получается

то есть сначала извлек из первой - убедился, что то, что надо, потом сделал left join (Один), потом второй

если всё все еще работает как ожидалось - делаешь к этому group by и так далее...

а не городить весь запрос, не понимая толком что он делает и пытаться найти ошибку непонятно где
 

Kotofeich

Новичок
Автор оригинала: Krishna
блин, забыл про человека)

основная мысль была - запрос надо строить постепенно, если не получается

то есть сначала извлек из первой - убедился, что то, что надо, потом сделал left join (Один), потом второй

если всё все еще работает как ожидалось - делаешь к этому group by и так далее...

а не городить весь запрос, не понимая толком что он делает и пытаться найти ошибку непонятно где
Спасибо за совет. Но я понимал что должен был делать запрос, и выполнял его последовательно дописывая части. Вот только у меня дома есть книжка по mysql, и в ней реально перечислены таблицы после LEFT JOIN через запятую. Это меня и сбило с понталогии:)
 
Сверху