2016-07-08 3 views
-2

Я практикую MySQL для предстоящего экзамена и нуждаюсь в некоторой помощи.MySQL подсчет элементов без использования счета (*)

У меня есть эта БД:
USER (Код, Имя, Фамилия, Возраст)
ТЕАТР (имя, город, Capacity)
подписка (ID, UserCode, TheatreName, Amount)

С этими ссылочную ограничения целостности:

SUBSCRIPTION.UserCode-> USER.Code
SUBSCRIPTION.TheatreName-> THEATRE.Name

для упражнения мне нужно Wr ite запрос, который определяет код, имя и фамилию пользователей старше 50 и кто имеет более одной подписки БЕЗ использования функции COUNT.
Я знаю, что, может быть, самообслуживание может помочь, но я действительно не знаю, как это сделать. Может кто-нибудь мне помочь? Большое спасибо.

ответ

1

Вы можете использовать

EXISTS:

SELECT u.Code, u.Name, u.Surname 
FROM USER u 
WHERE u.Age > 50 
AND EXISTS (
    SELECT 1 FROM SUBSCRIPTION s WHERE u.Code = s.UserCode 
) 

Или JOIN

SELECT DISTINCT u.Code, u.Name, u.Surname 
FROM USER u 
JOIN SUBSCRIPTION s 
ON u.Code = s.UserCode 
WHERE u.Age > 50 

Отредактировано:

SELECT DISTINCT u.Code, u.Name, u.Surname 
FROM USER u 
JOIN SUBSCRIPTION s1 
ON u.Code = s1.UserCode 
JOIN SUBSCRIPTION s2 
ON u.Code = s2.UserCode 
WHERE s1.ID <> s2.ID 
AND u.Age > 50 
+0

Мне очень жаль, но я не понимаю: ВЫБРАТЬ 1 абонентной s WHERE u.Code = s.UserCode Откуда берутся «1»? – JamieITGirl

+0

«1» не имеет смысла, вы можете заменить его на любой столбец в таблице 'SUBSCRIPTION', проверьте руководство по' EXISTS'. Кстати, это работает? – Blank

+0

Я думаю, вы пропустили вторую точку вопроса: мне нужно выбрать пользователей старше 50 и иметь более одной подписки. Ваши запросы удовлетворяют только первому запросу. – JamieITGirl

1

Я считаю, что самый простой способ сделать это, по существу, перепроектировать функцию подсчета в функции суммы с сазе Thusly:

SELECT 
    u.NAME 
, u.SURNAME 
, u.CODE 
, SUM(CASE WHEN t.SUBSCRIPTION IS NOT NULL THEN 1 ELSE 0 END) as TOTAL_SUBSCRIPTIONS -- IDENTICAL TO COUNT(s.*) 
, COUNT(s.*) -- SHOULD MATCH THE TOTAL_SUBSCRIPTIONS 
FROM 
USER AS u 
LEFT JOIN SUBSCRIPTION AS s 
ON u.CODE = s.USERCODE 
-- LEFT JOIN THEATRE AS t -- commented because I don't see a requirement for this table to be brought forward. 
-- ON s.THEATRENAME = t.NAME 
WHERE u.AGE > 50 
HAVING SUM(CASE WHEN t.SUBSCRIPTION IS NOT NULL THEN 1 ELSE 0 END) > 1 

Без использования CASE-Постулаты:

SELECT 
     u.NAME 
    , u.SURNAME 
    , u.CODE 
    , SUM((select SUM(1) from SUBSCRIPTION WHERE s.USERCODE = u.CODE)) as TOTAL_SUBSCRIPTIONS -- IDENTICAL TO COUNT(s.*) 
    FROM 
    USER AS u 
    WHERE u.AGE > 50 
+0

Спасибо, но мы не изучали функцию «case», поэтому мы не должны использовать это. Я считаю, что предыдущее решение - это то, что проф. имеет в виду. – JamieITGirl

+1

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

+0

Мы изучили почти все основные функции, кроме скалярных функций. Итак, да, мы можем использовать СУММУ. Благодарю. – JamieITGirl

Смежные вопросы