Sql запрос с 2 числами присоединения и подсчета и группированием по - PullRequest
0 голосов
/ 21 марта 2020

Я хочу использовать объединение, чтобы перечислить количество цветов, тип автомобиля и имя пользователя.

У меня есть 3 таблицы

Таблица 1 Useres

id|username|fullname
1 | test0  | xy xy
2 | test1  | yx yx

Таблица 2 Тип автомобиля

id|car_type|user_id
1 | Ford   | 1
2 | BMW    | 2
3 | Ford   | 1
4 | Skoda  | 1
5 | BMW    | 2

Таблица 3 Цвет автомобиля

id| Color  |user_id|car_id
1 | Red    | 1     |1
2 | Blue   | 2     |2
3 | Red    | 2     |5
4 | Red    | 1     |3
5 | Red    | 1     |4
6 | Green  | 1     |4

Один автомобиль имеет 2 цвета

Результат должен быть:

countType | CountColor  | UserName
   3      |    4        | test0
   2      |    2        | test1

Я попробовал это:

   SELECT 
   test as BlogsPost, 
   test2 as CommenstPost,
   u.name   
   FROM users u 
   LEFT JOIN (
       select COUNT(blogs.user_id) as test FROM blogs GROUP by blogs.user_id)  blogs
    on blogs.user_id=u.id 
   LEFT JOIN (
       select COUNT(comments.user_id) as test2 FROM comments GROUP by comments.user_id) comments
    on comments.user_id=u.id 
   GROUP by users.id

Ответы [ 2 ]

0 голосов
/ 22 марта 2020

Если я правильно понимаю ваш вопрос со ссылкой на ваш фактический раздел кода, вам нужен список пользователей с тем, сколько у них блогов и сколько комментариев. Теперь, если вы хотите посчитать одну таблицу соответствия, вы можете просто сделать это:

SELECT 
   U.NAME
   ,COUNT(1) AS BLOG_COUNT
FROM USERS U
LEFT JOIN BLOGS B
   ON B.USER_ID = U.ID
GROUP BY U.NAME

Но так как вы хотите сосчитать две таблицы, вы должны сделать это немного по-другому. Есть несколько способов сделать это, но мне нравится то, что мне нравится:

SELECT 
   U.NAME
   ,B.BB_COUNT AS BLOG_COUNT
   ,C.CC_COUNT AS COMMENT_COUNT
FROM USERS U
LEFT JOIN 
(
   SELECT 
      BB.USER_ID
      ,COUNT(1) AS BB_COUNT
   FROM BLOGS BB
   GROUP BY BB.USER_ID
) B
   ON B.USER_ID = U.ID

LEFT JOIN 
(
   SELECT 
      CC.USER_ID
      ,COUNT(1) AS CC_COUNT
   FROM COMMENTS CC
   GROUP BY CC.USER_ID
) C
   ON C.USER_ID = U.ID

Это может быть или не быть самым эффективным способом, но по моему опыту это работает довольно хорошо, и его легко понять. Все зависит от количества строк в таблицах и индексах и т. Д. c. Обычно идея состоит в том, чтобы сузить возвращаемые строки как можно быстрее. В этом случае у вас будет два подзапроса, но в итоге у них будет только столько строк, сколько у вас пользователей.

Еще одна вещь, которую нужно отметить, это вернет всех пользователей, точка. Это может быть не то, что вы хотите. Вы можете хотеть только подмножество пользователей. Если это так, этот внутренний выбор может быть не самым эффективным, потому что вы делаете расчеты для пользователей, которые могут не быть в конечном результате, тратя впустую время. Однако я могу сойти с топи c.

0 голосов
/ 21 марта 2020

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

SELECT 
(SELECT count(1) from CarType where user_id=username) as countType,
(SELECT count(1) from CarColor where user_id=username) as countColor,
username from (
SELECT username from Users
) a 

В качестве предложения для дизайна :

Таблица пользователей

Таблица автомобилей

Таблица цветов

Тогда у вас есть таблица отношений, где у вас есть user_id, car_id, color_id

Это будет правильный дизайн таблицы для этой структуры

...