PDOでcreate table

$time_start = microtime(true);
$dsn = "mysql:dbname=equity;host=localhost";
$user = "hoge";
$password = "hogehoge";
 
try {
    $dbh = new PDO($dsn, $user, $password);
} catch (PDOException $e){
    print('connection failed:'.$e->getMessage());
} 

$code= '2338';

$sql = "create table equity.code".$code."(
	id int unsigned auto_increment primary key,
	date int,
	close int
)ENGINE = MYISAM;";
$stmt = $dbh->query($sql);

$time = microtime(true) - $time_start;
echo "{$time}秒";

mysql 重複を除いた値の一覧抽出

以下で取得可能です。
SELECT DISTINCT colname FROM tablename;

mysql> select distinct sector from lists;
+————————–+
| sector |
+————————–+
| 水産・農林業 |
| 卸売業 |
| 建設業 |
| 非鉄金属 |
| 鉱業 |
| 機械 |
| サービス業 |
| 金属製品 |
| 情報・通信 |
| 食料品 |
| 医薬品 |
| 不動産業 |
| 陸運業 |
| その他金融業 |
| 小売業 |
| その他製品 |
| 繊維製品 |
| 電気機器 |
| ガラス・土石製品 |
| 証券業 |
| 輸送用機器 |
| REIT銘柄一覧 |
| 石油・石炭製品 |
| 化学 |
| パルプ・紙 |
| 精密機器 |
| ゴム製品 |
| 鉄鋼 |
| 銀行業 |
| 保険業 |
| 倉庫・運輸関連業 |
| 海運業 |
| 空運業 |
| 電気・ガス業 |
+————————–+
34 rows in set (0.05 sec)

早く気づけばよかった。

DBから同業種・同じ市場の銘柄を抽出する

select * from table where で条件を記載します。

$code = empty($_GET["code"])? 'null' : $_GET["code"];

$dsn = "mysql:dbname=equity;host=localhost";
$user = "hoge";
$password = "hogehoge";
 
try {
    $dbh = new PDO($dsn, $user, $password);
} catch (PDOException $e){
    print('connection failed:'.$e->getMessage());
} 


$sql = "select * from lists where code = $code";
$stmt = $dbh->query($sql);

$result = $stmt->fetch(PDO::FETCH_ASSOC);
$sector = $result['sector'];
$market = $result['market'];

echo "<b>".$result['name']. "</b>(".$code.") ";
echo $result['sector'] ." ".$result['market']. "<br><br>";
echo "同業種の銘柄(".$sector.")"."<br>";

$sql2 = "select * from lists where market = '$market' AND sector = '$sector' and code != $code";
$stmt2 = $dbh->query($sql2);
while($result = $stmt2->fetch(PDO::FETCH_ASSOC)){
	    echo $result["code"]." ".$result["name"]. "<br>";
}

mysqlでuniqueを後から追加

alter table music01 add unique (title);

入ってますね。

既にテーブルの中の値が重複している場合は、一度削除しなければなりません。

また、既にuniqueが設定されている場合は、上書きされて、uniqueが設定されます。
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0

mysql テーブル連携

まず、一つ目のテーブルを作くってデータを入れます。

create table cake.base(
	id int unsigned auto_increment primary key,
	code int,
	name varchar(255)
);

insert into base(code, name) values
('3689', 'イグニス'),
('4579', 'ラクオリア創薬'),
('3825', 'リミックスポイント');

二つ目のテーブルを作って、こちらにもデータを挿入。

create table cake.data(
	id int unsigned auto_increment primary key,
	code int,
	price int,
	time datetime default null
);

insert into cake.data(code, price, time) values
('3689', '3240', now()),
('3689', '3245', now()),
('3689', '3250', now()),
('3689', '3245', now());

INNER JOINでカラムを指定して結合する
SELECT base.code, base.name, data.price, data.time FROM base INNER JOIN data ON base.code = data.code;

OUTER JOIN
SELECT base.code, base.name, data.price, data.time FROM base LEFT OUTER JOIN data ON base.code = data.code;
dataが入っていないラクオリア創薬、リミックスポイントもselectされます。

更にテーブルを連結する場合も、joinでok
create table cake.market(
id int unsigned auto_increment primary key,
code int,
market varchar(255)
);

insert into market(code, market) values
(‘3689’, ‘マザーズ’),
(‘4579’, ‘ジャスダック’),
(‘3825’, ‘東証二部’);

SELECT base.code, base.name, data.price, data.time, market.market FROM base JOIN market ON base.code = market.code JOIN data ON base.code = data.code;

pdoでテーブルのデータを削除する

まず、mysqlにデータを入れます。

mysql> insert into kabuki(name, lat, lng) values('歌舞伎町店', '35.6969674', '139.700469');
Query OK, 1 row affected (0.10 sec)

mysql> select * from kabuki;
+-----------------+-----------+------------+
| name            | lat       | lng        |
+-----------------+-----------+------------+
| 歌舞伎町店      | 35.696967 | 139.700469 |
+-----------------+-----------+------------+
1 row in set (0.05 sec)

pdo exec(‘TRUNCATE TABLE kabuki’)でデータを削除します。

<?php

$dsn = "mysql:dbname=map;host=localhost";
$user = "hoge";
$password = "hogehoge";
 
try {
    $dbh = new PDO($dsn, $user, $password);
} catch (PDOException $e){
    print('connection failed:'.$e->getMessage());
}

$dbh->exec('TRUNCATE TABLE kabuki');
?>

削除されてますね。

mysql> select * from kabuki;
Empty set (0.10 sec)

地図データを入れる

CREATE TABLE google.markers (
	id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
	name VARCHAR(60) NOT NULL,
	address VARCHAR(80) NOT NULL,
	lat FLOAT(10, 6) NOT NULL,
	lng FLOAT(10, 6) NOT NULL,
	type VARCHAR(30) NOT NULL
) ENGINE = MYISAM;

INSERT INTO markers (`name`, `address`, `lat`, `lng`, `type`) VALUES ('Love.Fish', '580 Darling Street, Rozelle, NSW', '-33.861034', '151.171936', 'restaurant');
INSERT INTO markers (`name`, `address`, `lat`, `lng`, `type`) VALUES ('Young Henrys', '76 Wilford Street, Newtown, NSW', '-33.898113', '151.174469', 'bar');
INSERT INTO markers (`name`, `address`, `lat`, `lng`, `type`) VALUES ('Hunter Gatherer', 'Greenwood Plaza, 36 Blue St, North Sydney NSW', '-33.840282', '151.207474', 'bar');
INSERT INTO markers (`name`, `address`, `lat`, `lng`, `type`) VALUES ('The Potting Shed', '7A, 2 Huntley Street, Alexandria, NSW', '-33.910751', '151.194168', 'bar');
INSERT INTO markers (`name`, `address`, `lat`, `lng`, `type`) VALUES ('Nomad', '16 Foster Street, Surry Hills, NSW', '-33.879917', '151.210449', 'bar');
INSERT INTO markers (`name`, `address`, `lat`, `lng`, `type`) VALUES ('Three Blue Ducks', '43 Macpherson Street, Bronte, NSW', '-33.906357', '151.263763', 'restaurant');
INSERT INTO markers (`name`, `address`, `lat`, `lng`, `type`) VALUES ('Single Origin Roasters', '60-64 Reservoir Street, Surry Hills, NSW', '-33.881123', '151.209656', 'restaurant');
INSERT INTO markers (`name`, `address`, `lat`, `lng`, `type`) VALUES ('Red Lantern', '60 Riley Street, Darlinghurst, NSW', '-33.874737', '151.215530', 'restaurant');

where 1 は無条件で全データを抽出という意味。

mysql> select * from markers where 1;
+—-+————————+———————————————–+————+————+————+
| id | name | address | lat | lng | type |
+—-+————————+———————————————–+————+————+————+
| 1 | Love.Fish | 580 Darling Street, Rozelle, NSW | -33.861034 | 151.171936 | restaurant |
| 2 | Young Henrys | 76 Wilford Street, Newtown, NSW | -33.898113 | 151.174469 | bar |
| 3 | Hunter Gatherer | Greenwood Plaza, 36 Blue St, North Sydney NSW | -33.840282 | 151.207474 | bar |
| 4 | The Potting Shed | 7A, 2 Huntley Street, Alexandria, NSW | -33.910751 | 151.194168 | bar |
| 5 | Nomad | 16 Foster Street, Surry Hills, NSW | -33.879917 | 151.210449 | bar |
| 6 | Three Blue Ducks | 43 Macpherson Street, Bronte, NSW | -33.906357 | 151.263763 | restaurant |
| 7 | Single Origin Roasters | 60-64 Reservoir Street, Surry Hills, NSW | -33.881123 | 151.209656 | restaurant |
| 8 | Red Lantern | 60 Riley Street, Darlinghurst, NSW | -33.874737 | 151.215530 | restaurant |
+—-+————————+———————————————–+————+————+————+
8 rows in set (0.00 sec)

mysqlでのfloat

floatは4バイト、Dobuleは8バイト

mysql> CREATE TABLE google.float_test (
    -> id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    -> num FLOAT(10, 2)
    -> ) ENGINE = MYISAM;
Query OK, 0 rows affected (0.02 sec)

mysql> INSERT INTO float_test (num) VALUES (1.0), (1.1),(1.11),(1.111);
Query OK, 4 rows affected (0.13 sec)
Records: 4  Duplicates: 0  Warnings: 0

データを確認

mysql> select * from float_test;
+----+------+
| id | num  |
+----+------+
|  1 | 1.00 |
|  2 | 1.10 |
|  3 | 1.11 |
|  4 | 1.11 |
+----+------+
4 rows in set (0.00 sec)
CREATE TABLE google.float_test (
	id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
	num FLOAT(6, 2)
) ENGINE = MYISAM;

INSERT INTO float_test (num) VALUES (1.0), (10.1),(100.11),(1000.111);

mysql> select * from float_test;
+----+---------+
| id | num     |
+----+---------+
|  1 |    1.00 |
|  2 |   10.10 |
|  3 |  100.11 |
|  4 | 1000.11 |
+----+---------+
4 rows in set (0.00 sec)

どうやらfloat(n.y) のnは全体の桁数、yは小数点以下の桁数ですね。

mysqlでENGINE = MYSAMを指定しない場合

tableを作ります。

CREATE TABLE google.MYISAM (
	id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
	name VARCHAR (60) NOT NULL
) ENGINE = MYISAM;

CREATE TABLE google.NONE_MYISAM (
	id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
	name VARCHAR (60) NOT NULL
);
mysql> show tables;
+------------------+
| Tables_in_google |
+------------------+
| MYISAM           |
| NONE_MYISAM      |
+------------------+
2 rows in set (0.00 sec)

こちらのコマンドで、ストレージエンジンにMYISAMが使われているか、確認できます。

mysql> SELECT
    -> TABLE_SCHEMA,
    -> TABLE_NAME,
    -> ENGINE
    -> FROM
    -> information_schema.TABLES
    -> WHERE
    -> TABLE_SCHEMA NOT IN(
    ->
Display all 770 possibilities? (y or n)
    -> 'information_schema',
    ->
Display all 770 possibilities? (y or n)
    -> 'performance_schema',
    ->
Display all 770 possibilities? (y or n)
    -> 'mysql'
    -> );

以下のように、MYISAMを指定しない場合は、InnoDBのエンジンが使われていますね。

mysql> drop table MYISAM, NONE_MYISAM;
Query OK, 0 rows affected (0.01 sec)

mysql> show tables;
Empty set (0.00 sec)