セレクトで苦労したのでメモ。
抽出したいのは、field1に入っている日付系のデータを、
idごとで分けた、最大のデータ、且つ、今日以前のデータ。
idとfield1がpkです。
SELECT *
FROM testTb AS x
WHERE x.field1 = (SELECT MAX(field1)
FROM testTb
WHERE x.id = id
AND field1 <= now()
)
半ば消化不良ですが、どうやら、外のテーブル(x.testTb)のidと中のテーブル(testTb)のidを
サブクエリの中で対比させることによって、id分のMAXの値を抽出できるらしい。
ループしてるイメージでしょうか?それともグループ化?
ちなみに最後の、AND field1 <= now()を外に出すと動きません。
参考サイト:http://q.hatena.ne.jp/mobile/1213899211
- tag
- MySQL
- クエリ
フィールドに、'1,2,3'なんて文字列が格納されている場合、
'1'とか'2'とかの単体の検索を複数一気にかけたい場合、
select * from テーブル名 where INSTR(フィールド名,'1') and INSTR(フィールド名,'2');
これで。
- tag
- MySQL
- クエリ
MySQL文で、LEFT JOINを使用すると、指定したフィールドを条件にテーブルを結合してくれるが、その際にWHERE文で動きが特殊なので記載しときます。
例えば、こんな文。
SELECT * FROM?tb1 LEFT JOIN?tb2?ON?tb1.id = tb2.id WHERE tb2.name = NULL;
この場合、結合したテーブル tb2 のnameフィールドがNULLの場合、情報を呼び出す感じになっているが、実際データとして、NULLが入っていないと、抽出されるデータは存在しない状態になってしまう。
それでは困るのでなんとかならないか検索したところ、グッドな関数を発見。
IFNULL ってやつです。
これを使うとこんな感じ。
SELECT * FROM?tb1 LEFT JOIN tb2 ON?tb1.id = tb2.id WHERE IFNULL(tb2.name,0) = '0';
要は、NULLの場合、第二引数に指定している0に置き換えてやり、その置き換えたものをWHERE文で判断している形になります。
- tag
- MySQL
- クエリ
INを用いる事で、SQL文がひとまとまりにできます。
例えば、
UPDATE テーブル名 SET del_flag = '1' WHERE id = '1';
UPDATE テーブル名 SET del_flag = '1' WHERE id = '2';
UPDATE テーブル名 SET del_flag = '1' WHERE id = '3';
と三つの文を書かなければならないところを、
UPDATE テーブル名 SET del_flag = '1' WHERE id IN ('1','2','3');
とする事で、ひとまとまりの文にできます
- tag
- MySQL
- クエリ
select * from テーブル名 order by フィールド名 desc;
→フィールド名で降順出力。
select count(*) as 任意フィールド名 from テーブル名 where フィールド名 like '%条件%';
→あるフィールドの条件を含むレコードの数をカウント。
- tag
- MySQL
- クエリ