Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Проставить порядок следования цифр
 
 автор: P@Sol   (18.10.2006 в 10:04)   письмо автору
 
 

в таблице выводится

1 10 10 100%
2 12  8  67%
3 10  7  70%
4  9  7  78%


первый столбец - это место по 3-му столбцу, четвертый столбец = 3-ий/2-ой*100%

можно ли в пятом столбце вывести места по 4-му столбцу, т.е. чтобы было так:

1 10 10 100% 1
2 12  8  67% 4
3 10  7  70% 3
4  9  7  78% 2


значения для 3-го и 3-го столбца берутся из бд

   
 
 автор: Trianon   (18.10.2006 в 10:08)   письмо автору
 
   для: P@Sol   (18.10.2006 в 10:04)
 

Можно.

P.S. Но пока Вы не приведете php-код и дамп таблицы (если это MySQL-ная таблица), посоветовать, каким именно образом лучше всего этого достичь - крайне трудно.

   
 
 автор: P@Sol   (18.10.2006 в 10:18)   письмо автору
 
   для: Trianon   (18.10.2006 в 10:08)
 

в бд

id one two
1 12  8 
2  9  7  
3 10 10   
4 10  7  

вывожу

<?
$query 
"SELECT * FROM pingpong_player order by two DESC";

  
$plr mysql_query($query);
  if(
mysql_num_rows($plr)>0)
  {
          while(
$player mysql_fetch_array($plr))
          {
           echo 
"<tr>
                         <td><div style=\"text-align:center;\">
$n</div></td>
                         <td><div style=\"margin-left:15px;\">"
.$player["one"]."</div></td>
                         <td><div style=\"margin-left:15px;\">"
.$player["two"]."</div></td>";
            if  (
$player["two"]>0) echo round($player["two"]/$player["one"]*100,0)."%";
                         else echo 
"0";
                  echo 
"</div></td>
                  "
;
                  
$n++;
          }
  }

   
 
 автор: Trianon   (18.10.2006 в 10:20)   письмо автору
 
   для: P@Sol   (18.10.2006 в 10:18)
 

дамп - это то, что в phpMyAdmin вызывается на закладке 'export'

   
 
 автор: P@Sol   (18.10.2006 в 10:27)   письмо автору
 
   для: Trianon   (18.10.2006 в 10:20)
 

я знаю...что такое дамп...но там действительно больше нет...счас выложу раз вам надо

   
 
 автор: P@Sol   (18.10.2006 в 10:33)   письмо автору
 
   для: P@Sol   (18.10.2006 в 10:27)
 


CREATE TABLE `player` (
  `id_player` smallint(4) unsigned NOT NULL auto_increment,
  `one` tinytext NOT NULL,
  `two` smallint(6) NOT NULL default '0',
  PRIMARY KEY  (`id_player`)
) TYPE=MyISAM AUTO_INCREMENT=5 ;

#
# Дамп данных таблицы `player`
#

INSERT INTO `player` VALUES (1, 12, 8);
INSERT INTO `player` VALUES (2, 9, 7);
INSERT INTO `player` VALUES (3, 10, 10);
INSERT INTO `player` VALUES (4, 10, 7);

   
 
 автор: Trianon   (18.10.2006 в 10:39)   письмо автору
 
   для: P@Sol   (18.10.2006 в 10:27)
 

конечно там больше нет.
Но набивать тестовую таблицу руками (даже если в ней четыре строчки) и выполнить готовый sql-фрагмент - немного разные задачи.

   
 
 автор: Trianon   (18.10.2006 в 10:35)   письмо автору
 
   для: P@Sol   (18.10.2006 в 10:18)
 


SELECT t1.id_player, t1.one, t1.two, t1.two / t1.one *100 AS pct, count( * ) AS rate
FROM player AS t1
JOIN player AS tn ON tn.two / tn.one >= t1.two / t1.one
GROUP BY t1.id_player, t1.one, t1.two
ORDER BY two DESC , one DESC 


С учетом того, конечно, что one и two - числовые поля, а не текстовые.

   
 
 автор: P@Sol   (18.10.2006 в 10:43)   письмо автору
 
   для: Trianon   (18.10.2006 в 10:35)
 

где про это почитать можно?

JOIN - впервые вижу

   
 
 автор: Trianon   (18.10.2006 в 10:58)   письмо автору
 
   для: P@Sol   (18.10.2006 в 10:43)
 

э... тут я даже не знаю, что ответить...
В учебнике по SQL, которым Вы пользуетесь.
Я, конечно, могу дать ссылку на JOIN в руководстве по MySql http://www.mysql.ru/docs/man/JOIN.html, но это не самый лучший способ изучения языка.

   
 
 автор: P@Sol   (18.10.2006 в 11:49)   письмо автору
 
   для: Trianon   (18.10.2006 в 10:58)
 

что то немного не так

когда у двух одинаковое значение то выводит:

1 5 5 100% 2
2 4 4 100% 2

а можно вместо 2 и 2 - 1 и 2?
и у кого 0 0 0% должно быть не выводит:(

   
 
 автор: Trianon   (18.10.2006 в 12:18)   письмо автору
 
   для: P@Sol   (18.10.2006 в 11:49)
 

дамп с примером таблицы и требуемый ответ можно глянуть?

   
 
 автор: P@Sol   (18.10.2006 в 13:19)   письмо автору
 
   для: Trianon   (18.10.2006 в 12:18)
 


CREATE TABLE `player` ( 
  `id_player` smallint(4) unsigned NOT NULL auto_increment, 
  `one` smallint(6) NOT NULL default '0', 
  `two` smallint(6) NOT NULL default '0', 
  PRIMARY KEY  (`id_player`) 
) TYPE=MyISAM AUTO_INCREMENT=6 ; 


# Дамп данных таблицы `player` 


INSERT INTO `player` VALUES (1, 12, 8); 
INSERT INTO `player` VALUES (2, 9, 7); 
INSERT INTO `player` VALUES (3, 10, 10); 
INSERT INTO `player` VALUES (4, 10, 7); 
INSERT INTO `player` VALUES (5, 9, 9); 


должно быть

1 10 10 100% 1
2  9  9 100% 2
3 12  8  67% 5
4 10  7  70% 4
5  9  7  78% 3

   
 
 автор: Trianon   (18.10.2006 в 13:30)   письмо автору
 
   для: P@Sol   (18.10.2006 в 13:19)
 

я вижу, что первый столбик - явно не id. Что это?
И чем строка 10 10 раньше строки 9 9, если процент у обеих одинаковый?
И наконец, где в примере нули?

   
 
 автор: P@Sol   (18.10.2006 в 13:32)   письмо автору
 
   для: Trianon   (18.10.2006 в 13:30)
 


CREATE TABLE `player` (  
  `id_player` smallint(4) unsigned NOT NULL auto_increment,  
  `one` smallint(6) NOT NULL default '0',  
  `two` smallint(6) NOT NULL default '0',  
  PRIMARY KEY  (`id_player`)  
) TYPE=MyISAM AUTO_INCREMENT=6 ;  

#  
# Дамп данных таблицы `player`  
#  

INSERT INTO `player` VALUES (1, 12, 8);  
INSERT INTO `player` VALUES (2, 9, 7);  
INSERT INTO `player` VALUES (3, 10, 10);  
INSERT INTO `player` VALUES (4, 10, 7);  
INSERT INTO `player` VALUES (5, 9, 9);  
INSERT INTO `player` VALUES (6, 0, 0);  



1 10 10 100% 1 
2  9  9 100% 2 
3 12  8  67% 5 
4 10  7  70% 4 
5  9  7  78% 3 
6  0  0   0% 6

1 столбик отражает место занимаемое по 3 столбцу (10, 9, 8, 7, 7, 0)
10 выше 9 потому что 10>9...в принцепе можно и


1 10 10 100% 1 
2  9  9 100% 1 
3 12  8  67% 5 
4 10  7  70% 4 
5  9  7  78% 3 
6  0  0   0% 6

   
 
 автор: P@Sol   (20.10.2006 в 09:13)   письмо автору
 
   для: P@Sol   (18.10.2006 в 13:32)
 

Trianon, жду помощи

   
 
 автор: Trianon   (20.10.2006 в 09:33)   письмо автору
 
   для: P@Sol   (20.10.2006 в 09:13)
 

Как и почему должен выглядеть результат если добавить строку

INSERT INTO `player` VALUES (7, 10, 7);
?

   
 
 автор: P@Sol   (20.10.2006 в 09:57)   письмо автору
 
   для: Trianon   (20.10.2006 в 09:33)
 

желательно так:

1 10 10 100% 1  
2  9  9 100% 2  
3 12  8  67% 6  
4 10  7  70% 4  //id=4
5 10 7 70% 5 //id = 7
6  9  7  78% 3  
7  0  0   0% 7 

   
 
 автор: Trianon   (20.10.2006 в 10:04)   письмо автору
 
   для: P@Sol   (20.10.2006 в 09:57)
 

Ок. подумаю.

   
 
 автор: Trianon   (20.10.2006 в 11:11)   письмо автору
 
   для: P@Sol   (20.10.2006 в 09:57)
 

так... а почему пятый столбец у id=4 и id=7 отличается?

   
 
 автор: P@Sol   (20.10.2006 в 12:02)   письмо автору
 
   для: Trianon   (20.10.2006 в 11:11)
 

желательно чтобы было так:

1 10 10 100% 1   
2  9  9 100% 2   
3 12  8  67% 6   
4 10  7  70% 4  //id=4 
5 10 7 70% 5 //id = 7 
6  9  7  78% 3   
7  0  0   0% 7 

тут различаются только тем, что 4-ая строка выше 5-ой (получается что опять же от id зависит)

но можно и так

1 10 10 100% 1   
2  9  9 100% 1   
3 12  8  67% 6   
4 10  7  70% 4  //id=4 
5 10 7 70% 4 //id = 7 
6  9  7  78% 3   
7  0  0   0% 7 

тот код что написан выше выдает

1 10 10 100% 2
2  9  9 100% 2   
3 12  8  67% 6   
4 10  7  70% 5  //id=4 
5 10 7 70% 5 //id = 7 
6  9  7  78% 3   

   
 
 автор: P@Sol   (23.10.2006 в 11:01)   письмо автору
 
   для: P@Sol   (20.10.2006 в 12:02)
 

не получается?

   
 
 автор: Trianon   (23.10.2006 в 14:13)   письмо автору
 
   для: P@Sol   (23.10.2006 в 11:01)
 

Задача неясна.
Самое близкое, что мне удалось получить
это
SELECT t1.*, coalesce(t1.two/t1.one*100, 0) as s4, 1+count(t2.id_player) as s5 
from player as t1 left join player as t2 on 
t1.two*t2.one<t2.two*t1.one
group by t1.id_player
order by t1.two desc, t1.id_player desc

Если охота выжимать собственный (весьма абстрагированный от смысла) результат - действуйте сами.
В конце концов,какую-то коррекцию результатов можно и на уровне php сделать.

   
 
 автор: P@Sol   (24.10.2006 в 17:27)   письмо автору
 
   для: Trianon   (23.10.2006 в 14:13)
 

>Задача неясна.
>Если охота выжимать собственный (весьма абстрагированный от смысла) результат - действуйте сами.
я дал все данные, которые есть (или могут быть)...
1 10 10 100% 2 
2  9  9 100% 2    
3 12  8  67% 6    
4 10  7  70% 5  //id=4  
5 10  7 70% 5 //id = 7  
6  9  7  78% 3   
7  0  0   0% 7  

1-ый стольец место, которое занимает игрок по очкам;
2-ой максимальное кол-во очков, которое мог набрать игрок,
3-ий набранное кол-во очков
4-ый процент набранных очков
5-ый место по проценту набранных очков

>В конце концов,какую-то коррекцию результатов можно и на уровне php сделать.
можно..только, пожалуйста, расскажите как считается столбец s5?
Никак не разберусь с JOIN (читал Л. Томсон и Л. Веллинга)

   
 
 автор: Trianon   (24.10.2006 в 18:25)   письмо автору
 
   для: P@Sol   (24.10.2006 в 17:27)
 

s5 вычисляется как count(t2.id_player) group by t1.id_player
то есть считается число рядов таблицы t2 подошедших к ряду таблицы t1по условию
t1.two*t2.one<t2.two*t1.one, то есть когда ряды таблицы t2 имеют процент больший, чем ряд таблицы t1.
Для понимания можно попробовать вывести

SELECT t1.*, t2.*,coalesce(t1.two/t1.one*100, 0) as s4  
from player as t1 left join player as t2 on  
t1.two*t2.one<t2.two*t1.one 

и посчитать строки

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования