Struktura tabela:
Query:
Kao sto mozete zakljuciti iz tabele user uzimam parametar margin da bih sa njim pomnozio inputprice i update-ovao outputprice. Tabele nemaju puno slogova i recimo najveca tabela 'temprecord' nece nikad premasiti cifru od 100.000.
Pitanje je : da li je ovaj query mogao bolje da se napishe i koliko ovakav opterecuje bazu buduci da ima 2 subquerija.
Code:
mysql> desc temprecord;
+-------------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| from | varchar(20) | NO | MUL | NULL | |
| to | varchar(20) | NO | | NULL | |
| starttime | datetime | NO | | NULL | |
| duration | int(5) unsigned | NO | | NULL | |
| inputprice | float unsigned | NO | | 0 | |
| outputprice | float unsigned | YES | | 0 | |
| invoiceid | int(10) unsigned | YES | | NULL | |
+-------------+------------------+------+-----+---------+----------------+
mysql> desc phonenumber;
+--------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| userid | int(10) unsigned | YES | | NULL | |
| number | varchar(20) | YES | | NULL | |
+--------+------------------+------+-----+---------+----------------+
mysql> desc user;
+-----------+---------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+---------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| company | varchar(50) | NO | | NULL | |
| street | varchar(30) | YES | | NULL | |
| zip | varchar(5) | YES | | NULL | |
| city | varchar(30) | YES | | NULL | |
| country | varchar(30) | YES | | NULL | |
| username | varchar(20) | YES | | NULL | |
| person | varchar(50) | YES | | NULL | |
| password | varchar(32) | YES | | NULL | |
| userlevel | tinyint(3) unsigned | NO | | NULL | |
| blocked | tinyint(3) unsigned | YES | | NULL | |
| eurochf | varchar(3) | YES | | NULL | |
| margin | tinyint(3) unsigned | YES | | NULL | |
+-----------+---------------------+------+-----+---------+----------------+
mysql> desc temprecord;
+-------------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| from | varchar(20) | NO | MUL | NULL | |
| to | varchar(20) | NO | | NULL | |
| starttime | datetime | NO | | NULL | |
| duration | int(5) unsigned | NO | | NULL | |
| inputprice | float unsigned | NO | | 0 | |
| outputprice | float unsigned | YES | | 0 | |
| invoiceid | int(10) unsigned | YES | | NULL | |
+-------------+------------------+------+-----+---------+----------------+
mysql> desc phonenumber;
+--------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| userid | int(10) unsigned | YES | | NULL | |
| number | varchar(20) | YES | | NULL | |
+--------+------------------+------+-----+---------+----------------+
mysql> desc user;
+-----------+---------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+---------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| company | varchar(50) | NO | | NULL | |
| street | varchar(30) | YES | | NULL | |
| zip | varchar(5) | YES | | NULL | |
| city | varchar(30) | YES | | NULL | |
| country | varchar(30) | YES | | NULL | |
| username | varchar(20) | YES | | NULL | |
| person | varchar(50) | YES | | NULL | |
| password | varchar(32) | YES | | NULL | |
| userlevel | tinyint(3) unsigned | NO | | NULL | |
| blocked | tinyint(3) unsigned | YES | | NULL | |
| eurochf | varchar(3) | YES | | NULL | |
| margin | tinyint(3) unsigned | YES | | NULL | |
+-----------+---------------------+------+-----+---------+----------------+
Query:
Code:
update temprecord as t SET outputprice = inputprice * (1 +
(SELECT u.margin / 100 FROM `user` as u WHERE u.id =
(SELECT userid FROM phonenumber as p WHERE p.number = t.`from`)))
WHERE MONTH(t.starttime) = "12" AND YEAR(t.starttime) = "2008"
update temprecord as t SET outputprice = inputprice * (1 +
(SELECT u.margin / 100 FROM `user` as u WHERE u.id =
(SELECT userid FROM phonenumber as p WHERE p.number = t.`from`)))
WHERE MONTH(t.starttime) = "12" AND YEAR(t.starttime) = "2008"
Kao sto mozete zakljuciti iz tabele user uzimam parametar margin da bih sa njim pomnozio inputprice i update-ovao outputprice. Tabele nemaju puno slogova i recimo najveca tabela 'temprecord' nece nikad premasiti cifru od 100.000.
Pitanje je : da li je ovaj query mogao bolje da se napishe i koliko ovakav opterecuje bazu buduci da ima 2 subquerija.
Potpis
:: Nemoj se svadjati sa budalom, ljudi cesto nece primjetiti razliku ::