Как мне написать этот трехуровневый запрос mysql?

Это может быть немного сложно объяснить, но я постараюсь.

Я хочу отобразить список категорий (хранится в одной таблице) и количество доменов, связанных с каждой категорией (хранящихся в другой таблице).

В этом случае сложность заключается в том, что с каждым доменом связан набор записей (которые хранятся в третьей таблице). Я хочу показать только категории, с которыми связаны домены, а количество доменов должно отражать только те домены, с которыми связаны записи (из 3-й таблицы).

Мой текущий запрос

SELECT r.rev_id, c.cat_id, c.cat_name, count(d.dom_id) As rev_id_count FROM reviews r
INNER JOIN  domains d ON r.rev_domain_from=d.dom_id 
INNER JOIN  categories c ON d.dom_catid=c.cat_id  
WHERE rev_status = 1
GROUP BY cat_name  
ORDER BY cat_name

Это выбирает правильные имена категорий, но показывает ложный счетчик (rev_id_count). Если в категории 2 домена, и в каждом домене 2 записи, будет показано количество 4, тогда как должно быть 2.

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
4
0
2 775
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Что-то вроде этого?

SELECT c.name, count(d.id)
FROM categories c
JOIN domains d ON c.id = d.cid
JOIN records r ON r.did = d.id
GROUP BY c.name;

Это то, что у меня есть прямо сейчас. Он не отображает правильное количество доменов. если у меня есть 2 домена в категории, и каждый домен имеет 2 записи, будет отображаться счет как 4 вместо 2.

user15063 15.10.2008 09:55

Поддерживает ли MySQL COUNT (DISTINCT)? Затем попробуйте COUNT (DISTINCT (d.id)).

Tomalak 15.10.2008 10:36

Начните с выбора домена, в котором есть записи, а затем выберите категории, соответствующие этому домену.

так что-то вроде

 SELECT * FROM records 
    INNER JOIN domains on <clause> 
    INNER JOIN categories on <clause>
 WHERE <something>

Я не могу объяснить это слишком хорошо, но слишком часто при написании SQL легко смотреть на вещи из списка полей, которые мы хотим в select, и, как правило, использовать это, чтобы диктовать способ использования таблиц для построения данных. . Фактически, нам следует больше посмотреть, как данные связаны с создаваемым нами запросом (который часто кажется задом наперед).

Нет эффекта. Тот же результат, что и выше.

user15063 15.10.2008 10:32

Расширяя решение AquilaX, вам просто нужно выбрать имя домена:

SELECT c.name, d.name, count(d.id)
  FROM categories c
    JOIN domains d ON c.id = d.cid
    JOIN records r ON r.did = d.id
GROUP BY c.name, d.name;

Что должно показать:

Cat 1, Domain 1, 2
Cat 1, Domain 2, 1
Cat 2, Domain 3, 5

так далее...

(хотя не проверено)

select c.name, count(distinct d.did) from domains d
  left join categories c on c.cid = d.cid
  left join records r on r.did = d.did
  group by c.name

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

name     count
----     -----    
test     2
test2    2
Ответ принят как подходящий

SELECT Categories.Name,count(DISTINCT categories.name) FROM Categories
JOIN Domains ON Categories.ID=Domains.CID
JOIN Records ON Records.DID=Domains.ID
GROUP BY Categories.Name

Протестировано при следующей настройке:


CREATE TABLE Categories (Name nvarchar(50), ID int  NOT NULL IDENTITY(1,1))
CREATE TABLE Domains (Name nvarchar(50), ID int NOT NULL IDENTITY(1,1), CID int)
CREATE TABLE Records (Name nvarchar(50), ID int NOT NULL IDENTITY(1,1), DID int)

INSERT INTO Records (DID) VALUES (1)
INSERT INTO Records (DID) VALUES (1)
INSERT INTO Records (DID) VALUES (2)
INSERT INTO Records (DID) VALUES (2)
INSERT INTO Records (DID) VALUES (3)
INSERT INTO Records (DID) VALUES (3)

INSERT INTO Domains (Name,CID) VALUES ('D1',1)
INSERT INTO Domains (Name,CID) VALUES ('D2',1)
INSERT INTO Domains (Name,CID) VALUES ('D5',1)
INSERT INTO Domains (Name,CID) VALUES ('D3',2)
INSERT INTO Domains (Name,CID) VALUES ('D4',2)

INSERT INTO Categories (Name) VALUES ('1')
INSERT INTO Categories (Name) VALUES ('2')
INSERT INTO Categories (Name) VALUES ('3')

Другие вопросы по теме