私はめちゃくちゃばかげているに違いないことを知っていますが、(少なくとも私にとっては)かなり複雑なステートメントを使用してデータベースにクエリを実行しようとしています。予想よりも多くの行が表示されます。これを「修正」する方法を知っている人はいますか?
クエリしているテーブルは次のように作成されます。
glycoPeptide | CREATE TABLE `glycoPeptide` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`protein` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1 |
run | CREATE TABLE `run` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`glycoPeptide` int(11) NOT NULL,
`run` enum('spectrum','chromatogram') NOT NULL,
`glycoType` enum('N','O') DEFAULT NULL,
`glycoSite` int(11) DEFAULT NULL,
`pepMass` varchar(5) DEFAULT NULL,
`pepSeq` varchar(50) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `glycoPeptide` (`glycoPeptide`),
CONSTRAINT `run_ibfk_1` FOREIGN KEY (`glycoPeptide`) REFERENCES `glycoPeptide` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1 |
spectrum | CREATE TABLE `spectrum` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`run` int(11) NOT NULL,
`glycoform` varchar(255) DEFAULT NULL,
`spectrum` enum('m/z','intensity') NOT NULL,
PRIMARY KEY (`id`),
KEY `run` (`run`),
CONSTRAINT `spectrum_ibfk_1` FOREIGN KEY (`run`) REFERENCES `run` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=29 DEFAULT CHARSET=latin1 |
precursor | CREATE TABLE `precursor` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`run` int(11) NOT NULL,
`retentionTime` time DEFAULT NULL,
`mzValue` float DEFAULT NULL,
`chargeState` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `run` (`run`),
CONSTRAINT `precursor_ibfk_1` FOREIGN KEY (`run`) REFERENCES `run` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=latin1 |
binaryDataArray | CREATE TABLE `binaryDataArray` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`spectrum` int(11) NOT NULL,
`arrayLength` int(11) NOT NULL,
`EncodedLength` int(11) NOT NULL,
`arrayData` text,
PRIMARY KEY (`id`),
KEY `spectrum` (`spectrum`),
CONSTRAINT `binaryDataArray_ibfk_1` FOREIGN KEY (`spectrum`) REFERENCES `spectrum` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=29 DEFAULT CHARSET=latin1 |
2つのタンパク質(IgGとIgE)のテストデータがあります。IgGには、1つのランのみが含まれ、1つのグリコサイトのみが含まれるため、binaryDataArrayの1つの「セット」のみが含まれます。IgEには3つのグリコサイトが含まれているため、3回の実行があり、各実行には複数のスペクトル(それぞれ2つのbinaryDataArrayのセット)を含めることができます。
私は次のクエリを使用します(JOINSを使用するとよりきれいになります):
select
precursor.mzValue,
glycoPeptide.protein,
binaryDataArray.arrayLength,
binaryDataArray.encodedLength,
precursor.chargeState,
run.pepMass,
run.PepSeq
from
precursor,
glycoPeptide,
binaryDataArray,
spectrum,
run
where
run.glycoPeptide = glycoPeptide.id AND
spectrum.run = run.id AND
precursor.run = run.id AND
binaryDataArray.spectrum = spectrum.id AND
spectrum.spectrum like 'm/z' AND
precursor.mzValue like '1196.79' AND
glycoPeptide.protein like 'IgE' AND
run.glycoSite like '252' AND
run.glycoType like 'N';
私が期待するような結果のIgGの収量:
+---------+---------+-------------+---------------+-------------+---------+-----------+
| mzValue | protein | arrayLength | encodedLength | chargeState | pepMass | PepSeq |
+---------+---------+-------------+---------------+-------------+---------+-----------+
| 933.4 | IgG | 10301 | 22912 | 3 | 1189. | EEQYNSTYR |
+---------+---------+-------------+---------------+-------------+---------+-----------+
1 row in set (0.00 sec)
IgEの場合(上記のステートメントを使用)、次の結果が得られます。
+---------+---------+-------------+---------------+-------------+---------+-----------+
| mzValue | protein | arrayLength | encodedLength | chargeState | pepMass | PepSeq |
+---------+---------+-------------+---------------+-------------+---------+-----------+
| 1196.79 | IgE | 10301 | 109880 | 3 | 1033. | GTVNLTWSR |
| 1196.79 | IgE | 10301 | 54940 | 3 | 1033. | GTVNLTWSR |
| 1196.79 | IgE | 10301 | 54940 | 3 | 1033. | GTVNLTWSR |
+---------+---------+-------------+---------------+-------------+---------+-----------+
3 rows in set (0.00 sec)
ここでは1行しか期待できないのですが、気が進まないようです。
どんな助けでも大歓迎です
-編集1--
私がwhere句を書いた方法は、私が知る限り、結合が行うことを正確に行う必要があるので、それが問題になることはありません...
-編集2-
サンプルデータ:
select * from glycoPeptide;
+----+---------+
| id | protein |
+----+---------+
| 1 | IgG |
| 2 | IgE |
+----+---------+
2 rows in set (0.00 sec)
mysql> select * from run;
+----+--------------+----------+-----------+-----------+---------+-----------------+
| id | glycoPeptide | run | glycoType | glycoSite | pepMass | pepSeq |
+----+--------------+----------+-----------+-----------+---------+-----------------+
| 1 | 1 | spectrum | N | 297 | 1189. | EEQYNSTYR |
| 2 | 2 | spectrum | N | 275 | 1516. | NGTLTVTSTLPVGTR |
| 3 | 2 | spectrum | N | 252 | 1033. | GTVNLTWSR |
| 4 | 2 | spectrum | N | 99 | 1556. | VAHTPSSTDWVDNK |
+----+--------------+----------+-----------+-----------+---------+-----------------+
4 rows in set (0.00 sec)
select * from precursor;
+----+-----+---------------+---------+-------------+
| id | run | retentionTime | mzValue | chargeState |
+----+-----+---------------+---------+-------------+
| 1 | 1 | 00:13:32 | 933.4 | 3 |
| 2 | 2 | 00:00:00 | 965.55 | 2 |
| 3 | 2 | 00:00:00 | 912.036 | 2 |
| 4 | 2 | 00:00:00 | 1127.06 | 3 |
| 5 | 3 | 00:00:00 | 1099.97 | 2 |
| 6 | 3 | 00:00:00 | 1153.9 | 3 |
| 7 | 3 | 00:00:00 | 1196.79 | 3 |
| 8 | 4 | 00:00:00 | 1109.5 | 2 |
| 9 | 4 | 00:00:00 | 1157.66 | 2 |
| 10 | 4 | 00:00:00 | 1225.66 | 2 |
| 11 | 4 | 00:00:00 | 1206.47 | 3 |
| 12 | 4 | 00:00:00 | 1328.31 | 3 |
| 13 | 4 | 00:00:00 | 1304.09 | 3 |
| 14 | 4 | 00:00:00 | 1165.04 | 2 |
+----+-----+---------------+---------+-------------+
14 rows in set (0.00 sec)
mysql> select * from spectrum;
+----+-----+-----------+-----------+
| id | run | glycoform | spectrum |
+----+-----+-----------+-----------+
| 1 | 1 | G1F | m/z |
| 2 | 1 | G1F | intensity |
| 3 | 2 | NULL | m/z |
| 4 | 2 | NULL | intensity |
| 5 | 2 | NULL | m/z |
| 6 | 2 | NULL | intensity |
| 7 | 2 | NULL | m/z |
| 8 | 2 | NULL | intensity |
| 9 | 3 | NULL | m/z |
| 10 | 3 | NULL | intensity |
| 11 | 3 | NULL | m/z |
| 12 | 3 | NULL | intensity |
| 13 | 3 | NULL | m/z |
| 14 | 3 | NULL | intensity |
| 15 | 4 | NULL | m/z |
| 16 | 4 | NULL | intensity |
| 17 | 4 | NULL | m/z |
| 18 | 4 | NULL | intensity |
| 19 | 4 | NULL | m/z |
| 20 | 4 | NULL | intensity |
| 21 | 4 | NULL | m/z |
| 22 | 4 | NULL | intensity |
| 23 | 4 | NULL | m/z |
| 24 | 4 | NULL | intensity |
| 25 | 4 | NULL | m/z |
| 26 | 4 | NULL | intensity |
| 27 | 4 | NULL | m/z |
| 28 | 4 | NULL | intensity |
+----+-----+-----------+-----------+
28 rows in set (0.00 sec)
mysql> select id, spectrum, arrayLength, encodedLength from binaryDataArray;
+----+----------+-------------+---------------+
| id | spectrum | arrayLength | encodedLength |
+----+----------+-------------+---------------+
| 1 | 1 | 10301 | 22912 |
| 2 | 2 | 10301 | 3092 |
| 3 | 3 | 10301 | 54940 |
| 4 | 4 | 10301 | 109880 |
| 5 | 5 | 10301 | 54940 |
| 6 | 6 | 10301 | 109880 |
| 7 | 7 | 10301 | 102408 |
| 8 | 8 | 10301 | 109880 |
| 9 | 9 | 10301 | 109880 |
| 10 | 10 | 10301 | 54940 |
| 11 | 11 | 10301 | 54940 |
| 12 | 12 | 10301 | 109880 |
| 13 | 13 | 10301 | 54940 |
| 14 | 14 | 10301 | 109880 |
| 15 | 15 | 10301 | 109880 |
| 16 | 16 | 10301 | 54940 |
| 17 | 17 | 10301 | 54940 |
| 18 | 18 | 10301 | 109880 |
| 19 | 19 | 10301 | 109880 |
| 20 | 20 | 10301 | 54940 |
| 21 | 21 | 10301 | 109880 |
| 22 | 22 | 10301 | 54940 |
| 23 | 23 | 10301 | 54940 |
| 24 | 24 | 10301 | 109880 |
| 25 | 25 | 10301 | 54940 |
| 26 | 26 | 10301 | 109880 |
| 27 | 27 | 10301 | 109880 |
| 28 | 28 | 10301 | 54940 |
+----+----------+-------------+---------------+
28 rows in set (0.00 sec)
-編集3-
現在必要なデータは、リレーションの1つがデータベースにないため、データベースから収集できません(スペクトルをプリカーサーにリンクできる必要があります)。この欠陥を発見するのを手伝ってくれたRadical氏とJack氏に感謝し、Jackの回答を受け入れました。これは、クエリでの結合の表記が、私が行った方法よりも読みやすいためです。