ある整数型のカラムnumがあって、
その内容が、100以下の素数であるレコードだけ抜き出すために
SQLを簡潔に書く方法はありますでしょうか
where num=2 or num=3 or num=5 (略) num=89 or num=97
と書いてもいいんですが、
たとえば
where num={2,3,5,7,11,(略),83,89,97}
のようなまとめた書き方があったら教えてください
876 :
NAME IS NULL:2012/07/06(金) 10:55:54.73 ID:sgE42f78
iPhone用アプリとしてXcodeとSQLiteでメニューをデータベースにして、
オーダーエントリーシステムを作ろうと思っているのですが、
SQLiteのデータベースから特定の範囲を指定して呼び出す方法がありましたら
ご教授頂きたくお願い申し上げます。
具体的にはカテゴリーとして「パスタ」「サラダ」「ドリンク」等があり、
テーブルビューのリンクを、それぞれの名称にした上で、
そのカテゴリーの範囲内のみをリンクで表示する場合です。
>>876 select * from メニュー where カテゴリー = 'パスタ';
とか。SQL 勉強しなよ。
878 :
876:2012/07/06(金) 15:07:15.87 ID:sgE42f78
>>877 早速ありがとうございます。
-(void)readWordFromDatabase {
db = [FMDatabase databaseWithPath:databasePath];
aryDatabase = [[NSMutableArray alloc] init];
[db setLogsErrors:TRUE];
[db setTraceExecution:TRUE];
if (![db open]) {
NSLog(@"Failed to open database");
return;
}
else {
NSLog(@"Openned database successfuly");
}
FMResultSet *rs = [db executeQuery:@"SELECT DISTINCT * FROM menu"];
while ([rs next]) {
//int aID = [rs intForColumn:@"id"];
int aPk = [rs intForColumn:@"pk"];
int aCategory = [rs intForColumn:@"category"];
int aPrice = [rs intForColumn:@"price"];
//int aCt = [rs intForColumn:@"category"];
NSString *aCtname = [rs stringForColumn:@"ctname"];
NSString *aName = [rs stringForColumn:@"name"];
singleStudent *sStudent = [[singleStudent alloc] initWithData:aPk :/*aID :aCt*/aCategory :aPrice :aCtname :aName];
[aryDatabase addObject:sStudent];
[sStudent release];
}
[db close];
}
今、現状がこうなっていのですが、イメージとしては、テーブルビューのメニューで、
データベースはひとつのファイルのまま、パスタ、サラダ、ドリン等のカテゴリーから
パスタを選ぶと、ペペロンチーノ、カルボナーラ、アンチョビとキャベツのパスタ
といった様に、各商品が選べる様にしたいのですが、現状で、パスタのメニューの数だけ、
パスタ、パスタ、パスタ、パスタ、パスタ、パスタ、パスタ、と表示されてしまうので、
カテゴリー毎にまとめられないかと思っていたのですが、可能でしょうか?
なんじゃこの質問の仕方
どこをポイントにしたいんだ?
クエリか?
テーブル構造か?
それともコードか?
最低でも現状のテーブル構造とか出せる情報は出してよ
普通はカテゴリマスタとメニュー商品マスタ作って結合するだろ
何をしていいか分かっていないんだろうねw
>>873-874 where とか in 句の数とかって上限なかったっけ?
100 までの素数ぐらいだったら大丈夫かな。
もっと大きいところまでやるなら、素数テーブルを用意して
select テーブル.* from 素数テーブル left join テーブル on 素数テーブル.素数 = テーブル.num;
とかかな。
sqliteLimit.h
# define SQLITE_MAX_SQL_LENGTH 1000000000
# define SQLITE_MAX_EXPR_DEPTH 1000
$ for i in {1..1000}; do stmt="${stmt} OR id = ${i}"; done
$ echo -n "SELECT name FROM people WHERE id = 0 ${stmt};" | sqlite3 entry.sqlite3
Error: Expression tree is too large (maximum depth 1000)
883 :
881:2012/07/07(土) 05:38:53.25 ID:???
>>881 ぼけてるな > 俺
left じゃなくて、inner だった。
>>882 なるほど、1000 もあれば大抵大丈夫か。
>>878 あーわかった
メニューにはカテゴリ名が直接入ってて、それでグルーピングしたいってことね。
select カテゴリ from メニュー group by カテゴリ
アプリでもSQLでも出来るだろうけどカテゴリごとに件数数えるとかじゃなければ、
普通はカテゴリだけならカテゴリだけのテーブルから名前を持ってくる。
メニューのテーブルにはカテゴリの名は直接入れちゃダメ
そういうテーブル構成になってないんならそう作り直したほうが良い。
どうせ宿題でしょ?正規化とか結合でググるんだ
メニューテーブルmenu(メニューに関する属性のみ)
menu_id menu_name price menu_desc cat_id
カテゴリテーブルcategory(カテゴリに関する属性のみ)
cat_id cat_name
メニューを出す時にカテゴリ名も引っ張ってきたい時は結合を使う
select
menu_name,
cat_name
from
menu m left join category c
on m.cat_id = c.cat_id
where
price <= 2000
とか。俺だったらクエリで出来ることはなるべくクエリでやる。
885 :
NAME IS NULL:2012/07/08(日) 00:28:32.91 ID:O1K9KaSi
DATETIME型のレコードを使っていて、それを日別にカウントしたいとき
GROUP BY date(ctime)
とすると、EXPLAINで見るとインデックスが使われずに full scan となってしまうのですが
良い方法ないでしょうか
どう考えてもフルスキャンが一番早いだろ
>>885 基準日からの日数列を作って、それで group by するとか。
MySQLだとちゃんとインデックス使ってくれるので、クエリプランナが弱いのかな
非正規化するしかないっすかねぇ
グルーピングの時にカバーリングインデックスが使えるならインデックス見たほうが早い。それだけですむから。
そうでなければ全体に対する必要部分の行数でどっちが早いか変わってくるでしょ。
アーキテクチャの違いもあるので、一概にインデックスさえ見れば早いということは言えんのだ。
autoincrementでつけた主キーをselect以外で取得する方法はありますか
主キーはインデックスが自動的につくられるんですか
>>890 select * from sqlite_sequence;
>>892 要件をよく読め
> select 以外
894 :
NAME IS NULL:2012/07/12(木) 09:53:17.54 ID:ynTShOVI
sqlite3のdbに " を含む内容を登録したいのですが " 以降が登録されません。
sqliteの中身は以下です。
$query = $con->prepare("SELECT * FROM sample WHERE list=?");
$query->execute(array($list));
$listの中身は"を何個か含む200文字程度の内容になります。
array の意味がわからん。
なんで $list 直接指定しないの?
896 :
894:2012/07/12(木) 13:06:39.03 ID:+vrI1x3+
エスケープとかプレースホルダーを使っている場面やクエリーの増減があるため使いまわしていたためです。
特に問題がなかったのでarrayで渡してました。
なんで登録したいのに提示したSQLはselectなんだよw
>>896 >エスケープとかプレースホルダーを使っている場面やクエリーの増減があるため
文脈がよくわからん…
array 外すか array の中身を晒すかどっちかにしてくれ
>>897 ほんとだワロタw
それじゃ " 以降がどうこう以前に行自体登録できるわけないじゃん
899 :
sage:2012/07/13(金) 09:26:52.79 ID:???
仮にarrayの中身が
aaaaaaa"fuga"bbbbbbb
としたら\でエスケープしてもダメなんだっけ?
エスケープすれば問題ないし、プレースホルダ使ってればエスケープする必要もない
>>899 \ 自体も適切にエスケープしないといけないなど面倒だから、
使える環境ならプレースホルダ推奨。
主キーはお気に入りなんですよ。
だい主キー とか言ったりしてな!
かなり酒呑んでるようですがw
ちょいと質問してもいいかい?
何の用途でsqliteを使ってるの?ちょっとした自作プログラム用?
大企業の基幹システムで使っております
業務ではメールサーバのアクセスログ解析のための中間データ置き場として、
プライベートではTwitterの自作botの元データ蓄積場所として、
日々お世話になっております
C# SQLite
80台のパソコンで共有フォルダがあります
そこに1つのSQLiteDBファイルをおいて
80台のクライアントから10秒ごとにselectするのは無謀でしょうか?
データ更新は1日に20回くらいしかないのですが更新されたら即座に通知したいと思っています
テーブル設計、
データ量、
取得クエリ、
実行するマシンのスペックによって
余裕だったり、きつかったりするよ!
共有フォルダって、SQLiteのプログラム自体は各クライアントにあるの?
共有のシステムにもよるが多分破綻するぞ
素直にSQL Server Expressとか使えばいいのに
その規模だとタダでつかえるDBがたくさんあるのにSQLiteに固執する
意味がわからない
>>908 まずは用途と、SQLiteを使わないといけない理由を。
その上で、どうしてもSQLiteを使うなら、せめて各クライアントからは直接DBを叩かずにサーバ側のSQLiteで一括して処理するようにするべき。
80台のクライアントから同じ共有ファイルに同時アクセスし続けないといけない状況は、SQLiteと関係なく設計がまずい気がする。
ポーリングするより、イベントアラータのようなクライアントへの通知機能もったDB使った方がよいと思う。
915 :
908:2012/07/19(木) 01:39:41.71 ID:???
実はSQLServer2008とVisualWebDeveloperで作成したものでデータ管理はしております
私はプログラム歴2年の新米なのですがデータ管理をするにあたって、
いろいろ調べていたらSQLiteを見つけました
インストールなし、ファイル1個、そのくせパワフル?、Androidに標準搭載
パソコンのOSで言ったらLinuxか?? みたいな感じで一目惚れでした
今回、管理するデータは重要な物でもないし量も多くないし
SQLiteを試してみよと思いいろいろ挑戦していた次第でした
多くのアクセスを使いこなすにはそれなりにハードルがあるんですね
でももうちょっと挑戦してみます
現状はWebサーバーがあってその上で走るCGIなりASPが SQL Server 2008 にアクセスするようなシステム構成なんですか?
917 :
908:2012/07/19(木) 12:58:02.39 ID:???
>>916 1台のPCにSQLServer2008とIISをインストールしてそこにクライアントがIEでアクセスしてます
>>917 やろうとしている事を乱暴に言ってしまえば、
複数のSQL Serverインスタンスを用意して
全てのサーバーが一つのデータディレクトリを参照しているようなもの
読み取り専用としてならいいけど今回のケースなら止めて置いた方が…
いやいや
それなら行けるんじゃないか?
walモードが使えるから。
walなら更新は読み込みを阻害しないよ。
取り敢えずやってみて検証結果を教えて欲しいっ。
それならって言うのは現状と同じようにdbへのアクセスを一台のノードか代理する形ね
>>917の構成ならまあできないこともないが
最初の質問とちょっと形態が違うからなあ
922 :
NAME IS NULL:2012/07/26(木) 16:54:14.10 ID:/aBlwIAM
Sqlite3で以下のクエリで検索してます。
SELECT * FROM list WHERE sample=$sample and access=$access and level=$level LIMIT 1
この仲のaccessを曖昧検索に変えたいのですが曖昧検索ではLIKE と % を使用するというのを見ました。
複数条件があるWHEREの後にLIKEをどのようにつければいいのでしょうか?
923 :
NAME IS NULL:2012/07/26(木) 18:03:51.74 ID:D083zD7I
>>922 普通にaccess like $accessではいかんのか
$accessの中身を%文字%にするんだ
WHERE (access LIKE '%foo%' OR access LIKE '%bar%') AND level=なんたら
sqliteのintegerにunsignedを指定したいのですが不可能でしょうか?
制約
python3.2からsqlite3使ってたんだけど
text型のフィールドにYYYY-MM-DD形式の日付をinsertして
selectで取り出したらなぜか4桁になってた
両端にシングルクォーテーションつけ忘れてるだけだった……
sql = "insert into test values (2012-08-05)" #←x selectすると結果が1999になる
sql = "insert into test values ('2012-08-05')" #←o
実際は変数使ってるから解決するまでにすごい悩んだ
prepare使おうぜ
お前の父ちゃんは文字列連結でSQL文を作っちゃいけないということも教えてくれなかったのか?
SQLite ManagerでおもむろにDB設定をクリックしたら
ユーザーバージョンなる項目がありました
SQLiteでそれを変更したり参照する文があるのでしょうか?
バージョンはテーブルを作ってそこで管理していたので
デフォルトでそのようなものが用意されていたなら次からはそれを使おうと思うのですが
へ〜っ、こんな機能あるんだ。
通りすがりだけど、勉強になった、サンクス。
sqliteでtext型の漢字ソートってやっぱ厳しいですか?
普通にorder byしても思った通りにならず・・・
そもそも君が思っている漢字ソートってどんなのよ。
まさかと思うが、読みの順とかいいだすんじゃ…
>>933 どのDBMSでも漢字ソートには無理がある
そのとおりです読みの順番です
やっぱ膨大な辞書DBでもないと無理ですよね
なんか関数を組み込めるらしいので出来たりしないかなと思ったのですが
>>936 漢字コードの並びはJIS第一水準が音読みで第二水準が部首順じゃなかったかな。
だから読みで並べるのは無理だし、漢字には複数の読み方があるので
期待通りには並ばないな。
素直にフリガナ付けてそっちでソート
ふつうに考えれば音訓複数の読みがある上に複合語では同じ単語でも読みが異なるとか
そのままソートが不可能だと思わないのかな?
940 :
NAME IS NULL:2012/08/10(金) 10:47:54.29 ID:dgVF/wY5
老舗と世論が並んでたらどっちが先にくるのかっていう
>>939 漢字列でソートしてくれなんて要求が有ったら
脊髄反射レベルで断る。
日本向けにカスタマイズされた日本製RDBMSでもあれば
そういう機能も組み込んでるでしょう
まあたぶんないけど
>>940 ?と思ったけど「ろうほ」なんて読み方有るんだな、知らなかった。
944 :
NAME IS NULL:2012/08/10(金) 13:27:16.96 ID:dgVF/wY5
浅草と浅草寺とか
>>942 組み込んでるも何も、原理的に無理という話なんだが。
原理的に無理じゃない
作ろうと思えば作れる
じゃあ
>>240 の分だけでいいから、作ってみなよ。
948 :
NAME IS NULL:2012/08/10(金) 15:44:23.82 ID:dgVF/wY5
藤村俊二と島崎藤村とか
>>946 漢字の1〜n個の全ての組み合わせのソート用辞書を作れば不可能ではないな。
そんなんやるんなら素直にふりがな付けます。
>>949 その組み合わせのどれを選択するつもりなんだよ…。
ネタで言ってるんじゃないなら、まじでプログラマー向いてないと思うぞ。
>>950 漢字の全ての組み合わせに決まっておろうw
組み合わせの結果、存在しない熟語も含めて全てふりがな辞書を作る。
JIS第1と第2で6,355文字あるので10文字の組み合わせだけでも
107437414620186645551479209503916015625通り
計算違うか?w
今のハードでは無理だな
プログラマーに向いているとかの前に日本人じゃないんだろう。漢字を知らないとしか思えない。
>>953 そういうのは普通のアプリ開発でも制限事項とするだろう。
それが許容されるかどうかは
>>933 の顧客(?)の要求仕様次第。
>>954 漢字を知らない連中がユニコード作っちゃったわけだが
>>955 複数の読み方がある熟語は入力禁止とか? (w
これを「制限事項」とか言ってくるベンダーいたら今後取引しないよ。
世論はせろんでもよろんでも意味は同じだが
追従はついしょうとついじゅうで意味が異なる。
困ったなw
>>957 なんでやねん
片方の読みに統一やがな
>>958 『追従』だけでてきたら何かわからんがな
>>952 にあるような天文学的組み合わせが出てきた時点でネタ確定ですがな
おまえら暇なんやのぅ
ORDER BYの話題になってないって話でしょ。
これ任意のソートってできないの?
「任意のソート」とか言う、オレオレ用語をちゃんと定義してくれ。
つまりオレオレ並べ替え。
一行目を二行目と三行目の間に突っ込むとか。
Excel でも使っとけ。
みんな難しい事考えてるのね
× 難しいこと
○ アホなこと
おまえらしょうもないスケージュール管理とかそんなことしかやってないの?
ちょと何言ってるかわかんない
ORDER BY に延々と書けば好きな順番にできるw
夏休みで空気脳が降臨しましたw
日本脳炎ですね
>>974 >>963へのレスだよ。
同じ読みは人間でも区別付かないから無理だろ。
任意の順番なら、 ORDER BY num = 15 DESC, num = 3 DESC , ・・・
とかつなげりゃ好きな順番にできる。
×同じ読み
○漢字の読み
ミスった
>>971 一行目、二行目、三行目を識別するフィールドが無い場合は?
>>963 みたいな奴は、そういうテーブルでも何とかしろとか言うぞ。
Excel はできるからな。(w
識別するフィールドとかそういう専門用語はわからないけど個別にidならふってるよ
カードのシャフルみたいにidとか関係なく何枚目を何枚目の後に移動とかそういう事じゃないの?
だからそう言ってんじゃん
978を読めよ
このスレきもすぎ
983 :
NAME IS NULL:2012/08/13(月) 23:00:13.37 ID:7Zv3PRLA
というか文字列型って単なるbinary string扱いなんだよな
substr() がマルチバイト対応されてないので、五十音索引ページとか作ろうとすると、
アプリ側でもう一度集約処理してあげないといけなくて、うへぇ。。
ふり仮名データみたいなのを一緒に持たせないときびしい
>>983 > substr() がマルチバイト対応されてないので
http://www.sqlite.org/lang_corefunc.html substr(X,Y,Z): If X is a string then characters indices refer to actual UTF-8 characters.
> create table t (name text);
> .separator '\n'
> .import test.txt t1 -- test.txt は、このスレの内容を utf-8 で保存したもの。
> select substr(name, 1, 1), count(*) from t group by substr(name, 1, 1) order by count(*);
...
"お",94
"な",96
"あ",102
"ど",110
s,128
h,130
"こ",136
S,178
9,194
4,222
6,226
5,228
7,228
8,230
2,240
3,248
1,260
"そ",272
>,724
"",1562