Archive

Archive for İ

Sütunda olan qiymətlərin hasilinin tapılması

Maraqlı bir tapşırıq verilmişdi MySQL User Group-da. Aktiv community faydalı üsullar kəşf edə bildi.
O üsulları və bəzi əlavələri də qeyd etməklə ümumiləşdirib yazıram.
Tapşırıq bundan ibarət idi:
`~ Deyək ki, sales cədvəlində sales_id-nin qiymətləri var. hamısı integer olan bu qiymətlərin hasilini tapmaq lazımdır. Yəni sales_id-nin bütün data-larını bir-birinə vurmalıyıq. Asanlıq üçün sütundakı bütün data-ları yox 3 id-nin hasilini tapacıq. Eyni qayda bütün data-lara da şamil olunur~`

1-ci üsul Procedure. Kamil İbadovFarida Asadova tərəfindən irəli sürülmüş təklif əsasında. Tamamilə işləkdir.:

DELIMITER $$

CREATE PROCEDURE `hasil`()
BEGIN
     declare hasil bigint;
     declare eded int;
     declare v_last_row_fetched int;

     declare cursor1 cursor for
     select sales_id from sales where sales_id in(23,24,25);

     declare continue handler for not found set v_last_row_fetched=1;
       set hasil=1;
       set v_last_row_fetched=0;
       open cursor1;
            cursor_loop: loop
            fetch cursor1 into eded;
                 if v_last_row_fetched=1 then
                      leave cursor_loop;
                 end if;

                 set hasil=eded*hasil;
                 end loop cursor_loop;
     close cursor1;
     select hasil from dual;
     set v_last_row_fetched=0;

END$$

2-ci üsul Elşad Ağayev tərəfindən yazılıb:

set @var = 1;
select max(t.hasil) from 
(SELECT (@var := @var * sales_id) as hasil 
FROM sales where sales_id in(23,24,25)) as t;

3-cü üsul mənim tərəfimdən irəli sürülüb:

select exp(sum(log(sales_id))) from sales where sales_id in (23,24,25);

4-cü üsul da mənim tərəfimdən irəli sürülüb bu dünənki müzakirədə deyilmədi lakin son anda kəşf olundu:

select POW(2,SUM(LOG(2,sales_id))) from sales where sales_id in(23,24,25);

Təşəkkürlər 😉

Kateqoriyalar: MySQL Etiketlər: , , , ,

Installing Xtrabackup on Ubuntu 12.04

Xtrabackup haqqında artıq bir neçə yazılarımız olub. qısa olaraq Xtrabackup MySQL hot online backup tool-dur.
Xtrabackup-ı Ubuntu üzərinə install etmək üçün ardıcıllıqla:
1.

 apt-key adv --keyserver keys.gnupg.net --recv-keys 1C4CBDCDCD2EFD2A

2.
/etc/apt/sources.list faylına qeyd edirik:

deb http://repo.percona.com/apt precise main
deb-src http://repo.percona.com/apt precise main

precise yerinə ubuntu version-u yazmaq lazımdır.
Məsələn precise=12.04

10.04LTS (lucid)
12.04LTS (precise)
12.10 (quantal)
13.04 (raring)

Debian üçün:

6.0 (squeeze)
7.0 (wheezy)

3.

apt-get update
.
.
Fetched 3,254 kB in 46s (70.2 kB/s)

4.

apt-get install percona-xtrabackup
.
.
.
Setting up percona-xtrabackup (2.1.3-608.precise) ...

5. Bitdi.

root@sh-ubuntu:~# xtrabackup --version
xtrabackup version 2.1.3 for Percona Server 5.1.59 unknown-linux-gnu (x86_64) (revision id: 608)

Find duplicate records in table

Cədvəldə təkrar məlumatları necə aşkarlayaq?
Və yaxud da təkrar məlumat daxil edilmiş column-a necə unique index əlavə edək?
Cədvəlimiz:

CREATE TABLE dup_entry (
    id INT(11) NOT NULL AUTO_INCREMENT,
    a INT,
    b INT,
    PRIMARY KEY (id)
);

Və məlumatlarımız:

INSERT INTO dup_entry (a,b) VALUES (10,11),(10,11), (11,12),(12,13);

mysql> select * from dup_entry;
+----+------+------+
| id | a    | b    |
+----+------+------+
|  1 |   10 |   11 |
|  2 |   10 |   11 |
|  3 |   11 |   12 |
|  4 |   12 |   13 |
+----+------+------+
4 rows in set (0.00 sec)

Təbii ki məlumat sayı daha da çox ola bilər. Təkrarlanmış məlumatlar gördüyümüz kimi 10,11-di.
Təkrar məlumatları aşkarlamaq üçün sorğu:

mysql> select a,b,count(*) as cnt from dup_entry group by a,b having cnt>1;
+------+------+-----+
| a    | b    | cnt |
+------+------+-----+
|   10 |   11 |   2 |
+------+------+-----+
1 row in set (0.00 sec)

İndi isə a və b-ni unique edək.

mysql> alter table dup_entry add unique index(a,b);
ERROR 1062 (23000): Duplicate entry '10-11' for key 'a'

Məhşur error-u görürük. Onda belə çıxır ki biz bütün duplicate məlumatları delete edib daha sonra unique əlavə etməliyik? Xoşbəxtlikdən MySQL-in belə bir extension-u var. alter ignore:

mysql> ALTER IGNORE TABLE dup_entry ADD UNIQUE INDEX(a,b);
ERROR 1062 (23000): Duplicate entry '10-11' for key 'a'

Ooops. yenidən bu error-u verdi. Həlləri:
1. İnnoDB-dən MyİSAM-a müvəqqəti switch edirik:

-- 1
mysql> alter table dup_entry engine=myisam;
Query OK, 4 rows affected (0.36 sec)
Records: 4  Duplicates: 0  Warnings: 0
-- 2
mysql> ALTER IGNORE TABLE dup_entry ADD UNIQUE INDEX(a,b);
Query OK, 4 rows affected (0.16 sec)
Records: 4  Duplicates: 1  Warnings: 0

mysql> select * from dup_entry;
+----+------+------+
| id | a    | b    |
+----+------+------+
|  1 |   10 |   11 |
|  3 |   11 |   12 |
|  4 |   12 |   13 |
+----+------+------+
3 rows in set (0.00 sec)

Gördüyünüz kimi duplicate row-nu tapdı və avtomatik olaraq sildi, həmçinin də unique key əlave etdi.

mysql> show create table dup_entry;

 CREATE TABLE `dup_entry` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `a` int(11) DEFAULT NULL,
  `b` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `a` (`a`,`b`)
) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=latin1

2. old_alter_table alqoritmini aktiv edirik. Bu MySQL 5.0 versiyadan daha əvvəlki versiyalarda istifadə olunan bir üsuldur. Bu zaman MySQL Alter üçün temporary table yaradır, köhnə datanı həmin temporary cədvələ kopyalayır, alter edir daha sonra da rename edərək yeni cədvəl şəklində təqdim edir.
Default olaraq old_alter_table-ın qiyməti 0-dır yəni istifadə olunmur.

mysql> select @@old_alter_table;
+-------------------+
| @@old_alter_table |
+-------------------+
|                 0 |
+-------------------+
1 row in set (0.00 sec)

Biz dəyişirik və qiymətini 1 edirik:

mysql> set @@session.old_alter_table=1\G
Query OK, 0 rows affected (0.00 sec)

mysql> select @@session.old_alter_table;
+---------------------------+
| @@session.old_alter_table |
+---------------------------+
|                         1 |
+---------------------------+
1 row in set (0.00 sec)

Daha sonra da sınayırıq:

mysql> ALTER IGNORE TABLE dup_entry ADD UNIQUE INDEX(a,b);
Query OK, 4 rows affected (1.12 sec)
Records: 4  Duplicates: 1  Warnings: 0

mysql> select * from dup_entry;
+----+------+------+
| id | a    | b    |
+----+------+------+
|  1 |   10 |   11 |
|  3 |   11 |   12 |
|  4 |   12 |   13 |
+----+------+------+
3 rows in set (0.00 sec)

Bu üsul zamanı engine-ı dəyişməyə ehtiyac qalmır.

Təşəkkürlər 😉

Kateqoriyalar: MySQL Etiketlər: ,