SQL запрос настроить

kvf77

Red Devil
SQL запрос настроить

Задача следующая. Есть (таблицы конечно кастрированы для примера):
1) таблица в фамилиями авторов author_id, author_name
2) таблица дат календаря по каждому автору calendar_id, author_id
3) таблица связи авторов со статьями article_id, author_id
Необходимо выбрать всех авторов с их датами (если дата есть) и те, у кого есть статьи, пометить. Я делал это таким запросом:
SELECT DISTINCT author_name, IF(authors.author_id=articles_to_author.author_id, 1, 0) AS flag FROM authors, calendar, articles_to_author WHERE authors.author_id=calendar.author_id
По идее, поле flag должно содержать 1 если статьи у автора есть и 0 если нет, но результат другой - те авторы, статьи которых есть получают по две записи с 1 и 0, а те авторы, стей которых нет только 1 запись с 0. Как избежать избыточности данных?
А то сейчас мне приходится выбирать всех авторов и даты к ним, а потом смотреть (вторым запросом) есть ли у них статьи. Объясните, почему IF так работает. Как в SQL запросе проверить, если вообще нужное мне значение в таблице (в моем случае вообще достаточно проверить есть ли оно хотя бы раз)?
 

Demiurg

Guest
select .... from authors , calendar left join articles_to_author useing(author_id) where authors.author_id=calendar.author_id
 

Falc

Новичок
SELECT author_name, articles_to_author.author_id AS flag
FROM authors
INNSR JOIN calendar ON authors.author_id=calendar.author_id
LEFT JOIN articles_to_author ON authors.author_id=articles_to_author.author_id
GROUP BY authors.author_id

Примерно так.

-~{}~ 04.02.04 15:02:

Demiurg
Без групировки тут работать не будет.
 

kvf77

Red Devil
Не подходят эти примеры. Видно я не совсем правильно объяснил ситуацию.
Выбрать надо всех авторов, для которых есть дата в базе календаря. А для тех авторов, у которых есть статьи (то есть author_id есть в таблице articles_to_authors) пометить поставив, скажем, поле flag = 1, а если статьи нет - 0. Что я и пытался сделать в оригинальном примере. Помогите, очень надо! Это нужно, чтобы при выводе даты формировать ссылку на раздел автора (при наличии у него статей) или не формировать ее.

-~{}~ 05.02.04 10:31:

Исходные данные - есть таблицы авторов, календаря и таблица связи стетей с авторами.
необходимо сформировать таблицу календаря, где будут представлены все авторы, для которых есть дата, а те авторы, у которых есть еще и статьи на сайте должны быть сопровождены ссылкой на свой раздел. сейчас приходится делать множественным запросом. изначально пробовал так, но не работает (запрос по полям усечен):
SELECT DISTINCT author_name, author_date, IF(authors.author_id=articles_to_authors.author_if, 1, 0) AS flag FROM authors, calendar, articles_to_authors WHERE authors.author_id=calendar.author_id
В идеале мне хотелось бы видеть уникальные записи. Поле флаг имело бы 1 если статьи у автора есть и 0, если статей у него нет. Но результат таков - если у автора есть статьи я получаю 2 записи одинаковых кроме поля flag (есть запись и с 1 и с 0), а если статей нет - то только 1 запись - с 0. Дупы осмысленно выбить не получается (DISTINCT здесь не сработает, потому что из-за flag получаются разные записи). Как мне решить данную проблему одним запросом. А то сейчас приходится запрашивать всех авторов, а потом перед выводом смотреть еслть ли у них статьи - это не эффективно.
 

Demiurg

Guest
select distinct authors.* from authors , calendar left join articles_to_author useing(author_id) where authors.author_id=calendar.author_id
 

kvf77

Red Devil
Автор оригинала: Demiurg
select distinct authors.* from authors , calendar left join articles_to_author useing(author_id) where authors.author_id=calendar.author_id
У меня в MySQL useing не работает - что это за функция?
 
Сверху