Этот запрос должен делать то, что вы хотите.Он соединяет список ключевых слов с таблицей art_key
, чтобы найти все статьи с данным ключевым словом, а затем соединяет его со списком статей с изображениями (который находится в отдельном подзапросе JOIN
), чтобы определить, сколько статей сВ данном ключевом слове есть картинки.Ключевые слова предварительно обрабатываются и группируются для отображения с использованием LOWER
и TRIM
, чтобы сделать результат без учета регистра и толерантным к пробелу.
SELECT LOWER(TRIM(k.word)) AS keyword
, COUNT(DISTINCT a.article_id) AS num_articles
, COUNT(DISTINCT p.article_id) / COUNT(DISTINCT a.article_id) * 100 AS percent_with_pictures
FROM keywords k
LEFT JOIN art_key a ON a.keyword_id = k.id
LEFT JOIN (SELECT a.article_id
, COUNT(DISTINCT a.article_id) AS num_pictures
FROM art_key a
JOIN keywords k ON k.id = a.keyword_id AND LOWER(TRIM(k.word)) = '[picture]'
GROUP BY a.article_id) p ON p.article_id = a.article_id
GROUP BY keyword
HAVING COUNT(a.article_id) > 0
Я создал небольшую демонстрацию для SQLFiddle , чтобы показать, как я интерпретировал ваш вопрос и как работает запрос.
create table keywords (id int auto_increment primary key, word varchar(20));
insert into keywords (word) values
('sql'), ('SQL '), (' SQL'), ('SQl'), (' sQl '), ('MySQL'), ('[PICTURE]');
create table art_key(id int auto_increment primary key, article_id int, keyword_id int);
insert into art_key (article_id, keyword_id) values
(1, 2), (1, 3), (1, 4), (1, 6), (2, 1), (2, 5), (3, 4), (4, 5), (4, 2), (4, 6), (1, 7), (4, 7);
Вывод:
keyword num_articles percent_with_pictures
mysql 2 100
sql 4 50
[picture] 2 100