TableName = key_table
ID, GroupID, Key(文字列型), Value(文字列型)
1, 1, 'start_date', '2014-11-05'
2, 1, 'end_date', ''
3, 2, 'start_date', '2014-11-05'
4, 2, 'end_date', '2014-12-05'
5, 3, 'start_date', '2014-4-05'
6, 3, 'end_date', ''
start_dateが2014-11-05で、end_dateが''か未来にセットされているGroupID1とGroupID2を検索するSQLはどういう方法がありますでしょうか?
SELECT GroupID from key_table where (Name='start_date' AND Value = '2014-11-05') AND (Name='end_date' AND (Value = '' OR end_date > '2014-11-05')
な感じでやってみようと思ったのですが、動作しません。
このテーブル構造でどうしても検索しないといけません。
以上、よろしくお願いします。
A 回答 (2件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
self joinで無理矢理、table構造を作り替えるとか?
select st.GroupID
from ( select * from `key_table` where key='start_date' and Value = '2014-11-05' ) as st
inner join ( select * from `key_table` where key='end_date' and (Value > curdate() or Value="") ) as en
on st.GroupID = en.GroupID ;
大量行数になると、No1の方の回答のほうが速度は速いと思われる。
GroupID と Key カラムで連動unique index が貼ってある前提も必要。
GroupID が同じ行は必ず2行なのでしょうか?start_date の行はあるけど、end_date の行が無い場合は、選ばなくてもよいなら上記でok
end_dateの行が未入力で start_date がマッチするものもほしいなら、left join して以下のように
select st.GroupID
from ( select * from `key_table` where key='start_date' ) as st
left join ( select * from `key_table` where key='end_date' ) as en
on st.GroupID = en.GroupID
where st.Value = curdate() and (en.Value > curdate() or en.Value="" or en.Value is null )
;
蛇足:日付文字列のカラムは、date 型にしておいたほうが、エラー日付を弾いたり、日数計算に日付処理関数が使えるので便利ですよ。
No.1
- 回答日時:
構造が悪いのはしょうがないとして
こんな感じ?
select GroupID
from key_table
where (`Name`='start_date' and `Value`='2014-11-05')
or (`Name`='end_date' and (`Value`='' or Value > now()))
group by GroupID
having count(*)=2
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) データベースから絞り込んでデータを読み込み 1 2023/02/21 19:51
- Visual Basic(VBA) 【VBA】先月分の取得ができない理由が分かりません。 2 2022/04/24 11:16
- Visual Basic(VBA) VBAで日付入力しているのですが 4 2023/03/02 11:25
- Visual Basic(VBA) このVBAでExcelアプリケーションを作成は必要ですか? 3 2023/07/19 21:13
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- Visual Basic(VBA) Excel VBAの解読について質問があります。 概要は、マクロでチェックボックスにチェックすると日 1 2023/02/10 07:50
- Excel(エクセル) マクロで行を追加、削除すると行位置がずれますが、解決方法はありませんか?。 5 2022/05/28 16:03
- Visual Basic(VBA) マクロについて教えてください。 1 2023/06/06 00:57
- JavaScript 1日1回引けるJavaScriptおみくじについて 1 2022/12/12 22:28
- Visual Basic(VBA) ①ExcelVBAでカレンダーを作り、別のユザーフォームで日付を入力したいのですがエラーになります。 1 2023/02/17 18:39
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
複数のテーブルから値を合計出...
-
<SQL>重複しているデータの場合...
-
MySQLで特定のグループの上位3...
-
SQLで、同じ値が何回連続す...
-
SQL 重複しないJoinの仕方を教...
-
mysqlのif文かcase文で複数条件...
-
日付検索で0001-01-01 00:00:00...
-
SQLローダーCSV取込で、囲み文...
-
単一グループのグループ関数で...
-
SELECT FOR UPDATE で該当レコ...
-
select文の実行結果に空白行を...
-
count関数の値をwhere句で使用...
-
where句中のtrim関数について
-
AccessのSQL文で1件のみヒット...
-
レコードの登録順がおかしい
-
1の行を固定した上でVBAを用い...
-
Oracleで「文字が無効です」の...
-
【PL/SQL】FROM区に変数を使う方法
-
SQL*Loader Append
-
テーブルの最後(最新)のレコー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
<SQL>重複しているデータの場合...
-
複数のテーブルから値を合計出...
-
mysqlでunixtimeによる日付範囲...
-
SQL 重複しないJoinの仕方を教...
-
最新の日付と2番目の日付のデー...
-
DISTINCTROWについてです。
-
日付検索で0001-01-01 00:00:00...
-
MySQLで日付(date)型のdefaul...
-
MySQLで特定のグループの上位3...
-
mysqlコマンドとPHPで同じSQLの...
-
MySQLのdatetime型に0月0日を格納
-
SQLで、同じ値が何回連続す...
-
EXCEL 日付範囲内の日数カウン...
-
Mysqlで最新の日付を持つデータ...
-
サブクエリを使わない方法
-
mysqlに格納されている日付のデ...
-
先期末日の日付を求めるSQL
-
mysqlのif文かcase文で複数条件...
-
直近1ヶ月に誕生日を迎える社員...
-
MySQL「 INT」「 DATETIME」違い
おすすめ情報