Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MySQL > запрос артистов с подзапросами


Автор: mstdmstd 1.6.2015, 21:55
Всем привет,
Есть запрос в котором выбираются артисты кол-во обзоров к этим артистам и у скольких обзоров стоит пометка "inappropriate" :
Код

SELECT  `wp_aaso_artists`.* , (  SELECT count(*) 
  FROM `wp_aaso_artists_reviews` 
 WHERE `wp_aaso_artists_reviews`.`artist_id`= `wp_aaso_artists`.`ID` ) as reviewsCount, 
 (   SELECT count(*) 
  FROM `wp_aaso_artists_reviews_inappropriate`, `wp_aaso_artists_reviews` 
 WHERE `wp_aaso_artists_reviews_inappropriate`.`artist_review_id`= `wp_aaso_artists_reviews`.`ID` and    `wp_aaso_artists_reviews`.`artist_id`= `wp_aaso_artists`.`ID`    ) 
  as inappropriateReviewsCount 
  FROM `wp_aaso_artists` 
  HAVING reviewsCount > 0  and inappropriateReviewsCount > 0  LIMIT 5 OFFSET  0


И все хорошо и в inappropriateReviewsCount - сумма сколько именно обзоров с пометкой "inappropriate", но в данном запросе нужно сколько обзоров(wp_aaso_artists_reviews) 
имеют ссылку на "inappropriate" пометку, а не wp_aaso_artists_reviews_inappropriate . Как это лучше сделать?

Спасибо!

Автор: Akina 1.6.2015, 22:48
Лучше - грамотно поставить задачу. Дать DDL таблицы, репрезентативный набор данных и желаемый на этих данных результат с пояснениями, почему именно так.

Автор: mstdmstd 2.6.2015, 10:49
Таблицы 
Код

CREATE TABLE IF NOT EXISTS `wp_aaso_artists` (
`ID` int(10) unsigned NOT NULL,
  `name` varchar(50) NOT NULL DEFAULT '',
  `ordering` int(10) unsigned DEFAULT NULL,
  `is_active` enum('A','I') DEFAULT 'I',
  `email` varchar(50) NOT NULL DEFAULT '',
  `site` varchar(100) NOT NULL DEFAULT '',
  `birthday` date NOT NULL,
  `registered_at` datetime NOT NULL,
  `info` mediumtext,
  `updated` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
) ;

CREATE TABLE IF NOT EXISTS `wp_aaso_artists_reviews` (
`ID` int(10) unsigned NOT NULL,
  `user_id` bigint(20) unsigned NOT NULL,
  `artist_id` int(10) unsigned NOT NULL,
  `review_text` text NOT NULL,
  `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
) ;

CREATE TABLE IF NOT EXISTS `wp_aaso_artists_reviews_inappropriate` (
`ID` int(10) unsigned NOT NULL,
  `user_id` bigint(20) unsigned NOT NULL,
  `artist_review_id` int(10) unsigned NOT NULL,
  `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
) ;

  
wp_aaso_artists - таблица артистов с ключевыми полями  `ID`, `name` - все просто.
wp_aaso_artists_reviews - таблица обзоров(review_text) к этим артист Связь с артистами поле artist_id - также все просто .
wp_aaso_artists_reviews_inappropriate - таблица жалоб на обзоров выше, если есть строка - то есть жалоба.

Создать в wp_aaso_artists_reviews будево или целое поле не подходит, так как нужно инфа, от кого жалоба.
Первоначальный запрос читает СКОЛЬКО жалоб было на ревью артиста - что во многих случаях нужно.
В данном случае СКОЛЬКО жалоб НЕ важно, но важно, на сколько ревью были жалобы, что и не получилось...
Надеюсь, я все понятно изложил...   
  

Автор: Akina 2.6.2015, 12:00
Теперь свяжите правильно эти три таблицы:
Код

FROM wp_aaso_artists a
   , wp_aaso_artists_reviews r
   , wp_aaso_artists_reviews_inappropriate i
WHERE a.id = r.artist_id
  AND r.id = i.artist_review_id

Похоже на правду?
В такой отбор попадут исключительно обзоры, на которые была хотя бы одна жалоба.
Чтобы их посчитать, достаточно сгруппировать правильно (в каком там разрезе нужна статистика - общее число? для каждого артиста?) и посчитать количество с отсевом дубликатов COUNT(DISTINCT).

ЗЫ. Откорректируйте свой начальный пост и сделайте переносы строк, чтобы страницу не растягивало.

Автор: mstdmstd 3.6.2015, 09:16
Спасибо за участие!
Я немного изменил запрос и заместо звездочки указал какие поля счиьать с условием distict "distinct wp_aaso_artists_reviews_inappropriate.artist_review_id".
И полностю запрос выглядит так:
Код


SELECT distinct `wp_aaso_artists`.* , (  SELECT count(distinct wp_aaso_artists_reviews.ID ) 
  FROM `wp_aaso_artists_reviews` 
 WHERE `wp_aaso_artists_reviews`.`artist_id`= `wp_aaso_artists`.`ID` ) as reviewsCount, 
  (   SELECT count(distinct wp_aaso_artists_reviews_inappropriate.artist_review_id ) 
  FROM `wp_aaso_artists_reviews_inappropriate`, `wp_aaso_artists_reviews` 
 WHERE `wp_aaso_artists_reviews_inappropriate`.`artist_review_id`= `wp_aaso_artists_reviews`.`ID` and    `wp_aaso_artists_reviews`.`artist_id`= `wp_aaso_artists`.`ID`    ) as inappropriateReviewsCount 

  FROM `wp_aaso_artists` 
  HAVING reviewsCount > 0  and inappropriateReviewsCount > 0 


Я проверил - работает т вроде подвохов нет
Мне удобнее сделать с подзапросом - это конструктор и в зависимости от от выбранного фильтра подставляются разные поля

Автор: Akina 3.6.2015, 09:21
Тормозить будет безбожно... но это твои проблемы.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)