Есть 2 таблицы
table1:
name, id_iz_table2, chislo
table2:
id, max, name11, name12, name13, name14, name21, name22, name23, name24, obschee_chislo
Дано:
name
id_iz_table2=id
chislo
max (от 2 до 8, четное)
Нужен запрос:
1)если max=2
UPDATE table2 set name11='name_1', name21='name_2', obschee_chislo='chislo_1,chislo_2' where id='id_iz_table2'
2)если max=4
сортируем:
name11 примерно равен name21 по chislo (наименьшие)
name12 примерно равен name22 по chislo (наибольшее)
obschee_chislo="(сумма name11+name12),(сумма name21+name22)";
Ну и так далее... Помогите не лезет ничего в голову как это все сделать.
Спустя 16 часов, 36 минут, 49 секунд (5.07.2011 - 16:50) b00tanik написал(а):
Тут только процедурой на курсорах делать. Одним запросом не вариант.
Спустя 1 час, 30 минут, 41 секунда (5.07.2011 - 18:21) lightstar написал(а):
Цитата (b00tanik @ 5.07.2011 - 13:50) |
Тут только процедурой на курсорах делать. Одним запросом не вариант. |
Спустя 3 часа, 12 минут, 10 секунд (5.07.2011 - 21:33) lightstar написал(а):
Уфх...
Не нужно никаких продцедур. написал решение.
Вот таблицы:
Вот скрипт:
Покритикуйте, может чего не так.
Не нужно никаких продцедур. написал решение.
Вот таблицы:
CREATE TABLE table1 (
`name` varchar(15) default NULL,
`id_iz_table2` text default NULL,
`chislo` int(8) NOT NULL default '0',
PRIMARY KEY (name)
);
CREATE TABLE table2 (
`id` mediumint(8) NOT NULL auto_increment,
`table2_max` int(1) NOT NULL default '8',
`name_11` text default NULL,
`name_21` text default NULL,
`name_12` text default NULL,
`name_22` text default NULL,
`name_13` text default NULL,
`name_23` text default NULL,
`name_14` text default NULL,
`name_24` text default NULL,
`obschee_chislo` text default NULL,
PRIMARY KEY (id)
);
Вот скрипт:
<?php
include("db.php");// подключение базы данных
//задаем id table2
$id_iz_table2='1';
//запрос к table_2
$res = mysql_query("SELECT id, table2_max FROM table2 WHERE id='$id_iz_table2'");
if(mysql_num_rows($res)>0) {// если есть в БД
while($table2 = mysql_fetch_array( $res )){
$id=$table2['id'];
$table2_max=$table2['table2_max']; //ориентироваться будем по этому параметру
}
//запрос к table_1
//ORDER BY chislo обеспечивает
//примерно равные name по chislo
//от меньшего к большему
$res = mysql_query("SELECT name, chislo FROM table1 WHERE id_iz_table2='$id' ORDER BY chislo");
if(mysql_num_rows($res)>0) {// если есть в БД
//создаем 2 массива
$name = array();
$chislo = array();
while($table1 = mysql_fetch_array( $res )){
$name[]=$table1['name'];
$chislo[]=$table1['chislo'];
}
//формируем запрос к имени
for ($i=1; $i<=$table2_max; $i++) {
//проверяем четность т.к
//нужно ведь еще записывать в виде
//name11-name21 и тд
$i_2=$i-1;
if(gettype($i/2)==='integer'){ //если четное
$numb='2'; //преффикс name_X
$i_1=$i/2; //преффикс name_2Y
$mql_name_1="name_$numb$i_1='$name[$i_2]', ";
}else{ //если нечетное
$numb='1'; //преффикс name_X
$i_1=round($i/2); //преффикс name_1Y
$mql_name_1="name_$numb$i_1='$name[$i_2]', ";
}
//все что получилось
$mql_name.=$mql_name_1;
}
$mql_name_2=substr($mql_name, 0, -2); // вырезаем последние 2 символа ", "
//чем будем заполнять obschee_chislo?
//А вот чем и чихать на то что их 2,4,6 или 8 :)
$sum_1=$chislo[0]+$chislo[2]+$chislo[4]+$chislo[6]; //сумма 1
$sum_2=$chislo[1]+$chislo[3]+$chislo[5]+$chislo[7]; //сумма 2
//А ВОТ И ЗАПРОС
mysql_query("UPDATE table2 set $mql_name_2, obschee_chislo='$sum_1,$sum_2' WHERE id='$id_iz_table2'");
}else{
echo "записей нет";
exit;
}
}else{
echo "записей нет";
exit;
}
?>
Покритикуйте, может чего не так.
Спустя 47 минут, 56 секунд (5.07.2011 - 22:21) ИНСИ написал(а):
lightstar ничего не понял наверняка можно сделать куда проще ... используя функции в mysql JOIN и IF
Спустя 17 минут, 50 секунд (5.07.2011 - 22:39) alex12060 написал(а):
SELECT id, table2_max FROM `table2`
LEFT JOIN `table1` ON table2.id = table1.id_iz_table2
Это для первого запроса.
Спустя 10 минут, 41 секунда (5.07.2011 - 22:49) lightstar написал(а):
Цитата (INSIDIOUS @ 5.07.2011 - 19:21) |
lightstar ничего не понял |
Это упрощенная часть кода, который разбивает игроков на 2 команды, сортирую их по наименьшему рейтингу. Тобишь name11 и name21 в соответствующей записи во второй таблице при > 2 игроках будут с наименьшим рейтингом. В случае, если игроков < 8 (например 6) ячейки name14 и name24 будут NULL.
Спустя 6 минут, 27 секунд (5.07.2011 - 22:56) lightstar написал(а):
LEFT JOIN - возвращает строки из левой таблицы , даже если их нет в правой таблице
Зачем мне это? Он же вернет мне все записи, находящиеся в table1
Зачем мне это? Он же вернет мне все записи, находящиеся в table1