Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.05.2017, 17:32   #1
vikonder
 
Регистрация: 02.05.2017
Сообщений: 7
По умолчанию Запрос данных из 2 таблиц по критериям

Имеется 2 таблицы:

Table - Players
PlayerID PlayerName Balance UserAgentID
1054............QA1............10.. ........111
2055............QA2............20.. ........677
3056............QA3............55.. ........123
4067............Max............70.. ........123

Table - UsersAgents
UserAgentID Browser
111..............FireFox
123..............Chrome
444...............IE
677..............Safari

1. Write an SQL query that return players whose name doesn't contains QA and their Browser.
Solution: (possible)
PHP код:
SELECT p.PlayerNameu.Browser 
FROM Players 
AS pUsersAgents AS 
WHERE p
.PlayerName NOT LIKE "%QA%" 
2. Write an SQL query that summarize the balance for all Chrome players whose name start with QA.
Solution: (possible)
PHP код:
SELECT SUM(p.Balance)
FROM Players AS p
JOIN UserAgents 
AS u ON p.UserAgentID=u.UserAgentID
WHERE 
(u.Browser "Chrome" AND p.PlayerName LIKE "QA%"
3. Write an SQL query that will summarize the number of users per browser.
Solution: (possible)
PHP код:
SELECT u.BrowserSUM(p.UserAgentID) AS "Number Of Users"
FROM Players AS p
JOIN UserAgents 
AS u ON p.UserAgentID=u.UserAgentID 
Попинайте, решения.... особенно последнее.
Другие варианты также приветствуются...
Спасибо
vikonder вне форума Ответить с цитированием
Старый 16.05.2017, 17:39   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

А Вы запросы не проверяли? зря...

первый запрос с ошибкой - не указана связь между таблицами Players и UsersAgents

второй запрос ошибок не вижу (только скобки в where лишние. но это не ошибка).


третий запрос неправильный.
упущено GROUP BY
Serge_Bliznykov вне форума Ответить с цитированием
Старый 16.05.2017, 17:51   #3
vikonder
 
Регистрация: 02.05.2017
Сообщений: 7
По умолчанию

x10

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
А Вы запросы не проверяли? зря...

первый запрос с ошибкой - не указана связь между таблицами Players и UsersAgents

второй запрос ошибок не вижу (только скобки в where лишние. но это не ошибка).


третий запрос неправильный.
упущено GROUP BY
К сожалению, проверить негде...
По поводу первого, я правильно понимаю, что независимо от использования WHERE or JOIN, критерий по ключу будет выглядить одинаково --> p.UserAgentID=u.UserAgentID

PHP код:
SELECT p.PlayerNameu.Browser  
FROM Players 
AS pUsersAgents AS u  
WHERE p
.UserAgentID=u.UserAgentID AND p.PlayerName NOT LIKE "%QA%" 
По поводу третьего, .... GROUP BY u.Browser

PHP код:
SELECT u.BrowserSUM(p.UserAgentID) AS "Number Of Users" 
FROM Players AS 
JOIN UserAgents 
AS u ON p.UserAgentID=u.UserAgentID  
GROUP BY u
.Browser 
Но так как в условии не указан критерий сортировки, то это ТАКЖЕ может быть любой элемент таблицы или нет? (i.e. GROUP by u.UsersAgents)

Последний раз редактировалось vikonder; 16.05.2017 в 17:57.
vikonder вне форума Ответить с цитированием
Старый 17.05.2017, 01:24   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от vikonder Посмотреть сообщение
К сожалению, проверить негде...
ну, можно поискать хостинг с MySQL
можно поставить на комп любую СУБД (благо их, как грязи, в том числе и бесплатных).
впрочем, это дело ваше
можно и в уме отлаживать.
у меня лично это не всегда получается.


Цитата:
Сообщение от vikonder Посмотреть сообщение
По поводу первого, я правильно понимаю, что независимо от использования WHERE or JOIN, критерий по ключу будет выглядить одинаково --> p.UserAgentID=u.UserAgentID
почти, но, не не совсем. если Вы указали во FROM обе таблицы, тогда их связь нужно прописать в WHERE.
или убрать вторую таблицу из FROM и добавить JOIN


Цитата:
Сообщение от vikonder Посмотреть сообщение
Но так как в условии не указан критерий сортировки, то это ТАКЖЕ может быть любой элемент таблицы или нет? (i.e. GROUP by u.UsersAgents)
во-первых, не "сортировки", а "группировки" - это совсем разные вещи.
А во-вторых, стандарт SQL (и много хороших СУБД) не позволят Вам выбрать в SELECT поля, которые не указаны в GROUP BY.
поэтому нужно именно GROUP BY u.Browser

ну и ещё одна ошибка.
а зачем Вы делаете SUM(p.UserAgentID) ? вы реально хотите получить 123 + 123 + .... ?
Вам же нужно КОЛИЧЕСТВО.
поэтому
Код:
SELECT u.Browser, count(*) AS "Number Of Users" 
FROM Players AS p 
JOIN UserAgents AS u ON p.UserAgentID=u.UserAgentID  
GROUP BY u.Browser
Serge_Bliznykov вне форума Ответить с цитированием
Старый 17.05.2017, 14:00   #5
vikonder
 
Регистрация: 02.05.2017
Сообщений: 7
По умолчанию

Попытался создать в Oracle 2 таблицы:

Код:
CREATE TABLE players
(   PlayerID     numeric(5)     not null,
    PlayerName   varchar2(10)   not null,
    Balance      numeric(5),
    UserAgentID  numeric(5)     not null,	
    CONSTRAINT players_pk PRIMARY KEY (UserAgentID)
);


CREATE TABLE useragents
(   UserAgentID  numeric(5)     not null,
    Browser     numeric(10)     not null,
    CONSTRAINT fk_players
    FOREIGN KEY (UserAgentID)
    REFERENCES players(UserAgentID)
);
Но что-то здесь намудрил... со связями, т.к. при заполнении таблицы получаю ошибку для 4 INSERT

INSERT INTO "SYSTEM"."PLAYERS" (PLAYERID, PLAYERNAME, BALANCE, USERAGENTID) VALUES ('1054', 'QA1', '10', '111');
INSERT INTO "SYSTEM"."PLAYERS" (PLAYERID, PLAYERNAME, BALANCE, USERAGENTID) VALUES ('2055', 'QA2', '20', '677');
INSERT INTO "SYSTEM"."PLAYERS" (PLAYERID, PLAYERNAME, BALANCE, USERAGENTID) VALUES ('3056', 'QA3', '55', '123');
INSERT INTO "SYSTEM"."PLAYERS" (PLAYERID, PLAYERNAME, BALANCE, USERAGENTID) VALUES ('4067', 'Max', '70', '123');

....unique constraint (SYSTEM.PLAYERS_PK) violated

Последний раз редактировалось vikonder; 17.05.2017 в 14:16.
vikonder вне форума Ответить с цитированием
Старый 17.05.2017, 14:16   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Код:
CREATE TABLE players
(   PlayerID     numeric(5)     not null,
    PlayerName   varchar2(10)   not null,
    Balance      numeric(5),
    UserAgentID  numeric(5)     not null,	
    CONSTRAINT players_pk PRIMARY KEY (UserAgentID)
);
и FOREIGN KEY должен быть в таблице players
а в таблице useragents поле UserAgentID - это первичный ключ.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 17.05.2017, 14:25   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

попробуйте так:
Код:
CREATE TABLE players
(   PlayerID     numeric(5)     not null,
    PlayerName   varchar2(10)   not null,
    Balance      numeric(5),
    UserAgentID  numeric(5)     not null,	
    CONSTRAINT players_pk PRIMARY KEY (PlayerID),
    CONSTRAINT fk_useragents
    FOREIGN KEY (UserAgentID)
    REFERENCES useragents(UserAgentID)

);


CREATE TABLE useragents
(   UserAgentID  numeric(5)     not null,
    Browser     numeric(10)     not null,
    CONSTRAINT useragents_pk PRIMARY KEY (UserAgentID)
);
Serge_Bliznykov вне форума Ответить с цитированием
Старый 17.05.2017, 16:45   #8
vikonder
 
Регистрация: 02.05.2017
Сообщений: 7
По умолчанию

Таблицы создались нормально (вторая, затем первая)
но данные не вставляются ни в Players, ни в Useragents

Код:
INSERT INTO "SYSTEM"."PLAYERS" (PLAYERID, PLAYERNAME, BALANCE, USERAGENTID) VALUES ('1054', 'QA1', '10', '111')
ORA-02291: integrity constraint (SYSTEM.FK_USERAGENTS) violated - parent key not found
ORA-06512: at line 1

INSERT INTO "SYSTEM"."USERAGENTS" (USERAGENTID, BROWSER) VALUES ('111', 'FireFox')
ORA-01722: invalid number
ORA-06512: at line 1
Изображения
Тип файла: jpg ScreenHunter_06 May. 17 16.27.jpg (65.3 Кб, 84 просмотров)
vikonder вне форума Ответить с цитированием
Старый 17.05.2017, 16:50   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

вставлять надо сначала в таблицу справочник (это useragents)


Цитата:
Сообщение от vikonder Посмотреть сообщение
ORA-01722: invalid number
Цитата:
Browser numeric(10) not null,
может быть, потому что, поле Browser числовое?
если оно числовое, то зачем Вы в него строку записать пытаетесь?
ну и тоже самое касается поля UserAgentID

Код:
INSERT INTO "SYSTEM"."USERAGENTS" (USERAGENTID, BROWSER) VALUES (111, 1)
Serge_Bliznykov вне форума Ответить с цитированием
Старый 17.05.2017, 17:46   #10
vikonder
 
Регистрация: 02.05.2017
Сообщений: 7
По умолчанию

Пардон.
Скопировал из вашего примера, а там Number (10)

Сделал, как положено, начав со второй таблицы.
Теперь, все данные в таблицах, но вот незадача,
при попытке запустить любое корректное query из трёх выше
выскакивает Syntax Error - SQL command not properly ended
(и вручную чуруз sqlplus, и через sql developer)
i.e.
Изображения
Тип файла: jpg ScreenHunter_16 May. 17 17.45.jpg (81.7 Кб, 120 просмотров)
vikonder вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
SQL-запрос добавления данных в несколько таблиц Алексей_2012 SQL, базы данных 6 16.05.2017 11:44
Запрос данных из нескольких таблиц Daslife SQL, базы данных 5 07.01.2013 14:04
1 запрос, 2 подсчета по разным критериям Predator199 PHP 0 01.12.2012 17:41
Excel. Cчёт таблиц по критериям aoaoo Фриланс 1 17.05.2011 21:41
вложенный запрос выборка по многим критериям Droid БД в Delphi 2 23.05.2010 19:31