|
|
|
| Допустим имеем следующую таблицу tb_games
+------id-------+--------pl1-------+--------pl2-------+--------sc1-------+--------sc2-------+
| 1 | 1 | 2 | 0 | 2 |
| 2 | 1 | 3 | 1 | 3 |
| 3 | 2 | 3 | 3 | 1 |
| 4 | 3 | 1 | 2 | 0 |
| 5 | 1 | 4 | 1 | 2 |
| 6 | 4 | 2 | 4 | 1 |
| 7 | 1 | 2 | 0 | 0 |
| 8 | 2 | 3 | 1 | 2 |
| 9 | 3 | 1 | 2 | 1 |
+---------------+------------------+------------------+------------------+------------------+
|
Нужен такой запрос, чтобы он подсчитал количество забитых голов для, допустим игрока 2. Если бы игрок два всегда был в одной колонке (pl1 или pl2) то труда бы это не составило... а как сделать это, учитывая что игрок '2' каждый раз может оказаться в другой колонке, соответственно и количество забитых голов будет прыгать из sc1 в sc2...
можно конечно два отдельных запроса написать, но как написать сложный запрос и просуммировать полученые результаты от каждого из них я не знаю, помогите пожалуйста... | |
|
|
|
|
|
|
|
для: evilive
(20.08.2007 в 16:12)
| | Что-то типа такого
SELECT a.sc1 as s1, b.sc2 as s2 FROM table a LEFT JOIN table b ON (b.pl2=$gamer) WHERE a.pl1=$gamer
|
| |
|
|
|
|
|
|
|
для: evilive
(20.08.2007 в 16:12)
| |
SELECT sum(sc1)
FROM tb_games
WHERE (pl1=2)
UNION
SELECT sum(sc2)
FROM tb_games
WHERE (pl2=2)
|
вот такой запрос дает две строчки с нужными результатами. Осталось только просуммировать эти две строчки и вывести только ее, как это сделать ???? | |
|
|
|
|
|
|
|
для: evilive
(20.08.2007 в 17:15)
| |
SELECT sum(sc1) as sum1
FROM tb_games
WHERE (pl1=2)
UNION
SELECT sum(sc2) as sum2
FROM tb_games
WHERE (pl2=2)
|
и далее считаете типа $row[sum1]+$row[sum2] | |
|
|
|
|
|
|
|
для: Faraon
(20.08.2007 в 17:23)
| | извиняюсь, я просто дуб ))) немогли бы на примере показать... я так быстрее пойму :)...
...да, и может можно как-то оптимизировать этот запрос...
как сделать чтобы в результате выполенния запроса, была всего одна цифра, без промежуточных вычислений... | |
|
|
|
|
|
|
|
для: evilive
(20.08.2007 в 17:26)
| | Ну допустим так
<?php
require_once('./config.php');
$gamer=1;
$query=mysql_query("SELECT SUM(a.sc1) as s1,SUM(b.sc2) as s2 FROM table a LEFT JOIN table b ON (b.pl2=$gamer) WHERE a.pl1=$gamer");
while($d = mysql_fetch_array($query)){
print $d[s1]+$d[s2];
}
?>
|
Больше люблю LEFT JOIN | |
|
|
|
|
|
|
|
для: Faraon
(20.08.2007 в 17:48)
| | Фараон, вы бы хотя бы запрос по-человечески написали, а уж потом человеку предложили.
Сделаете так:
SELECT p, SUM (s)
FROM (SELECT pl1 p, sc1 s
FROM TEST
UNION ALL
SELECT pl2 p, sc2 s
FROM TEST) t
WHERE t.p = $value
GROUP BY p;
|
| |
|
|
|
|
|
|
|
для: oradev
(20.08.2007 в 21:02)
| | огромное спасибо... на данном этапе все получилось... но вопросы еще будут!! ;) | |
|
|
|
|
|
|
|
для: evilive
(20.08.2007 в 16:12)
| | Вот созрел и следующий вопрос...
... для определения количества ПОБЕД, НИЧЬИХ и ПОРАЖЕНИЙ использую следующие запросы:
SELECT COUNT (id) AS wins FROM tb_games WHERE (pl1=$player AND sc1>sc2) OR (pl2=$player AND sc2>sc1);
SELECT COUNT (id) AS draws FROM tb_games WHERE (pl1=$player AND sc1=sc2) OR (pl2=$player AND sc2=sc1);
SELECT COUNT (id) AS loses FROM tb_games WHERE (pl1=$player AND sc1<sc2) OR (pl2=$player AND sc2>sc1);
|
Интересует, есть ли возможность объеденить как-то эти три запроса в один, пусть вложеный, но чтобы результатом была таблица типа (например, для игрока id=1):
+---wins---+---draws---+---loses---+
| 0 | 1 | 5 |
+----------+-----------+-----------+
|
| |
|
|
|
|
|
|
|
для: evilive
(21.08.2007 в 11:25)
| | -- например, для игрока id=1
А причем здесь игрок ? Скорее всего речь идет о команде, которая задается параметром $player. | |
|
|
|
|
|
|
|
для: oradev
(21.08.2007 в 23:51)
| | Наверное вы имели ввиду вот это:
SELECT SUM (CASE
WHEN (pl1 = $player AND sc1 > sc2)
OR (pl2 = $player AND sc2 > sc1)
THEN 1
ELSE 0
END
) wins,
SUM (CASE
WHEN (pl1 = $player AND sc1 = sc2)
OR (pl2 = $player AND sc2 = sc1)
THEN 1
ELSE 0
END
) draws,
SUM (CASE
WHEN (pl1 = $player AND sc1 < sc2)
OR (pl2 = $player AND sc2 > sc1)
THEN 1
ELSE 0
END
) loses
FROM tb_games;
|
| |
|
|
|
|
|
|
|
для: oradev
(21.08.2007 в 23:51)
| | >>А причем здесь игрок ? Скорее всего речь идет о команде, которая задается параметром $player.
сорри, не объяснил изначально, всё это я делаю для Кибер спорта, т.е. для компьютерного футбола, а там 1 игрок - 1 команда :) | |
|
|
|
|
|
|
|
для: evilive
(22.08.2007 в 13:20)
| | Тогда, В принципе можно оформить запрос еще лучше, то есть например возврашать не для конкретной команды кол-во побед, поражений, и ничьих, а для всех( общий случай).
ком п н пр
ком1 3 2 3
ком2 4 4 5
комn 4 5 5
|
| |
|
|
|
|
|
|
|
для: oradev
(22.08.2007 в 13:31)
| | Если необходимо узнать кол-во побед, поражений и ничьих для всех команд, то можно применить следующий запрос:
SQL> select player,
2 sum(case when pr > 0 then 1 else 0 end) wins,
3 sum(case when pr = 0 then 1 else 0 end) draws,
4 sum(case when pr < 0 then 1 else 0 end) loses
5 from
6 (
7 select pl1 player, sign(sc1-sc2) pr from tb_games
8 union all
9 select pl2, sign(sc2-sc1) pr from tb_games
10 )
11 group by player;
PLAYER WINS DRAWS LOSES
---------- ---------- ---------- ----------
1 1 1 3
2 2 1 0
3 2 0 2
|
| |
|
|
|
|
|
|
|
для: oradev
(22.08.2007 в 23:10)
| | большое спасибо, буду пробовать... | |
|
|
|
|
|
|
|
для: oradev
(22.08.2007 в 23:10)
| | в чем может быть беда ?
Ошибка синтаксиса (пропущен оператор) в выражении запроса 'sum(case when pr > 0 then 1 else 0 end) wins'
|
пробовал так:
'sum(case pr when pr > 0 then 1 else 0 end) wins'
|
результат тот же... | |
|
|
|
|
|
|
|
для: evilive
(29.08.2007 в 14:41)
| | эх... после долгих мучений и всяческих шаманств, всетаки пришел к цели... оказывается, видимо, в аксессе просто нет таких операндов или хз почему он их не видит...
вот выкладываю модифицированый вариант, на случай если кто столкнется с проблемой...
SELECT TT.player, SUM(IIf(TT.pr>0,1,0)) AS WINs, SUM(IIF(TT.pr=0,1,0)) AS DRAWs, SUM(IIF(TT.pr<0,1,0)) AS LOSEs
FROM [SELECT gm_user1 as player, SGN(gm_score1-gm_score2) as pr FROM tb_games
UNION ALL
SELECT gm_user2, SGN(gm_score2-gm_score1) FROM tb_games]. AS TT, tb_user
WHERE TT.player = tb_user.user_id
GROUP BY player;
|
еще и функции SIGN оказалось что нет, еле нашел что она называется SGN :) | |
|
|
|
|
|
|
|
для: oradev
(22.08.2007 в 23:10)
| | и еще вопрос :)...
вот такой запрос
SELECT gm_user1, gm_user2, gm_score1, gm_score2
FROM tb_games
|
строит такой результат
gm_user1 gm_user2 gm_score1 gm_score2
1 2 3 0
3 4 1 1
1 3 3 2
|
а как теперь вместо айди юзеров подставить туда их ники или имена...
могу сделать только для одной колонки :) а как это промутить для двух не знаю... помогите )... я писал так :
SELECT tb_user.user_nickname, tb_games.gm_score1, tb_games.gm_score2
FROM tb_allgames
INNER JOIN tb_user
ON tb_games.gm_user1 = tb_user.user_id;
|
получается колонка с ником первого игрока, и еще две колонки с забитыми мячами, как сделать чтобы еще и ник соперника можно было вывести ? | |
|
|
|
|
|
|
|
для: evilive
(29.08.2007 в 17:43)
| | так, на этот вопрос ответ я нашел :) замутил так:
SELECT PL1,tb_user.user_nickname as PL2,SC1,SC2
FROM [SELECT tb_user.user_nickname as PL1, tb_games.gm_user2 as tempPL2, tb_games.gm_score1 as SC1, tb_games.gm_score2 as SC2
FROM tb_games INNER JOIN tb_user ON tb_games.gm_user1=tb_user.user_id] as TT
INNER JOIN tb_user
ON TT.tempPL2=tb_user.user_id;
|
т.е. получается тот запрос что я писал выше (который дела то что мне надо но только с одной колонкой) влаживаю как подзапрос для запроса который генерит таблицу которая мне надо, но со второй колонкой :)... думаю вроде правильно ...
... теперь нужа помощь с кейсами, у меня в аксессе не хочет запускаться так как написано выше... :(
P.S. хмм... глупо как-то, сам с собой общаюсь :(... неужели никто помочь не в силах ??? или я уже задолбал всех ??? :) | |
|
|
|
|
|
|
|
для: evilive
(30.08.2007 в 16:02)
| | Отпуск есть отпуск... | |
|
|
|
|
|
|
|
для: evilive
(30.08.2007 в 16:02)
| | ...хммм.. вот в обеденный перерыв, мой моск сгенерировал следующий скрипт :)
SELECT A.user_nickname, B.user_nickname, gm_score1, gm_score2
FROM tb_games, tb_user as A, tb_user as B
WHERE gm_user1=A.user_id AND gm_user2=B.user_id
|
С его помощью строится точно такая же таблица, только без всех этих сложных конструкций с джойнами :)... следовательно вытекает вопрос: как правильнее технически, как вернее стилистически, как быстрее?? вобщем как бы выполнили эту задачу ВЫ ?? | |
|
|
|
|
|
|
|
для: evilive
(31.08.2007 в 15:00)
| | C JOIN запрос легче читается, так как не приходится его читать сразу с начала и с конца. Кроме того, проще в него включить пустые результаты, если потребуется. | |
|
|
|
|
|
|
|
для: Loki
(31.08.2007 в 15:12)
| | Или вот так сделаете: в данном случае вы на самом деле соединяете N= 3 таблицы, поэтому и количество соединений в условии WHERE( в вашем случаи) равно k = N - 1 = 2
SELECT e.ename, e1.ename, t.sc1,t.sc2
FROM TEST t JOIN emp e ON (e.empno = t.pl1)
LEFT JOIN emp e1 ON (e1.empno = t.pl2);
|
| |
|
|
|