Как я могу сделать запрос в sql, который дает человеку больше домов? - PullRequest
0 голосов
/ 07 сентября 2018

У меня есть 2 стола, дом и клиенты, клиент может иметь много домов, но дом принадлежит только клиенту, мне нужен запрос, который дает мне человека, которому принадлежит больше домов, как я могу это сделать? Я знаю, как сделать Count (*) и Max, но я не могу построить правильный способ дать то, что я хочу

Столы жилой дом Я бы Цена Адрес Id_client

Клиенты Я бы Имя

Ответы [ 3 ]

0 голосов
/ 07 сентября 2018

Вы можете использовать следующее: -

SELECT clients.id, clients.name, count(id_client) AS houses_owned FROM house JOIN clients ON id_client = clients.id 
GROUP BY id_client 
ORDER BY count(id_client) DESC LIMIT 1;

Однако, если несколько клиентов владеют одинаковым количеством домов, принадлежащих большинству, тогда будет возвращен только один из них.

Например, рассмотрим следующий тестовый пример (): -

DROP TABLE IF EXISTS house;
DROP TABLE IF EXISTS clients;
CREATE TABLE IF NOT EXISTS house (id INTEGER PRIMARY KEY, address TEXT, id_client INTEGER);
CREATE TABLE IF NOT EXISTS clients (id INTEGER PRIMARY KEY, name);
INSERT INTO clients (name) VALUES ('Fred'),('Mary'),('Tom'),('Jane');
INSERT INTO house (address,id_client) VALUES 
    ('House 1',3),('House 2', 1),('House 3',2),('House 4',1),('House 5',3);
SELECT clients.id, clients.name, count(id_client) AS houses_owned FROM house JOIN clients ON id_client = clients.id 
GROUP BY id_client 
ORDER BY count(id_client) DESC LIMIT 1;

Результат будет: -

enter image description here

Однако у Тома также есть 2 дома, исключив условие LIMIT 1, что приводит к: -

enter image description here

0 голосов
/ 07 сентября 2018

Этот запрос вернет всех владельцев, которые имеют максимальное количество домов в собственности (т. Е. Если у 3 владельцев у всех 5 домов, а 5 - это максимальное количество домов, принадлежащих любому клиенту, это вернет все из них). Он объединяет clients с таблицей количества домов, принадлежащих каждому клиенту, а затем сравнивает это число с максимальным количеством домов, принадлежащих любому клиенту (подзапрос в предложении WHERE):

SELECT c.name, h.houses_owned
FROM clients c
JOIN (SELECT id_client, COUNT(*) AS houses_owned 
      FROM houses
      GROUP BY id_client) h
  ON h.id_client = c.id
WHERE h.houses_owned = (SELECT COUNT(*) AS houses_owned 
                        FROM houses
                        GROUP BY id_client
                        ORDER BY houses_owned DESC
                        LIMIT 1)

SQLFiddle Demo (спасибо @MikeT за данные)

0 голосов
/ 07 сентября 2018

Как предлагается в комментариях, это можно сделать с помощью дополнительного выбора.Суб-выбор будет захватывать всех клиентов и сколько у них домов, а затем заказывать их у клиента, у которого больше всего домов.Затем основной выбор получит первый результат из этого (используя limit 1), чтобы определить, у какого клиента больше домов.

select
sub.id,
sub.name,
sub.count
from (
    select clients.id, count(houses.id) as count
    from clients
    inner join houses on
    clients.id = houses.id_client
    group by houses.id_client
    order by count desc
) as sub
limit 1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...