>>935 この程度のことも分からずにプログラマやっていけてる?
体裁は良くないが、聞きたいことと内容は明確だろ。
937 :
NAME IS NULL:2013/05/28(火) 03:30:47.95 ID:pJTxBQZ+
アンカー間違ってるのか読む場所間違ってるのか区別付かんなw
こういうの、ウィンドウ関数できれいに書けたりするのかな?
あれが独自拡張なのか標準SQLにあるものなのかわかんないけど
>>936が安価ミスなのか、安価の先を見誤ったか、はたまた別かわからなくてもやっとする
プログラマならバグ直してください
>>939 窓関数はSQL2003から標準だけれどもどのRDBMSでも実装されているかは微妙。
無難にSQL92の範囲で書くなら
>>928みたいなサブクエリーを使う書き方になる。
でも確かに窓関数使うとスッキリ書ける。
SELECT score, address FROM T
ORDER BY MIN(score) OVER (PARTITION BY address), address, score
>>940 SQL2003からなのね。ありがとです。
すごいすっきりしてるし直感的だ、やっぱ使えるようにしとかないと。重ね重ねどもでした
再帰構造のテーブルをSQLで辿る事は可能でしょうか?
id parent value
1 null aaa
2 1 bbb
3 2 ccc
4 3 ddd
5 2 eee
このようなテーブルで4の親を辿って最初にid in (1,2)を満たすvalue(bbb)を探したいです。
DBはpostgresql9.3betaです。
944 :
NAME IS NULL:2013/05/30(木) 18:21:17.05 ID:zDo8DD4s
DB: oracle10g
テーブルにprimary key 制約(以下pk制約)を作成すると、
pk制約と同じ名前のunique indexが作られます。
このunique indexの名前をpk制約作成時に指定することは出来ますか?
作成後にalter indexで変更できることは確認済みです。
alter table TableA add constraint PK_CONST primary key (...);
select * from user_constraints where table_name = 'TableA';
select * from user_indexes where table_name = 'TableA';
pk制約、indexともに'PK_CONST'の名前になっている。
create table TableA (COLNAME number constraint PK_CONST primary key);
制約名とインデックス名を違う名前にしたいという話なら
unique indexを先に作れば
primary key using index インデックス名
でできるにはできるけど
>>945-947 ありがとうございました。
(1) create table
(2) create unique index
(3) alter table add constraint primary key using index
の順番で意図したことが実現出来ました。
一応、下記の方法でも可能でした。
DDLが分かれている方が都合が良かったので採用してません。
create table aaa (
a int,
constraint pk_const primary key (a)
using index (create unique index index_const on aaa(a))
);
950 :
NAME IS NULL:2013/06/07(金) 17:32:29.57 ID:yGnvQyXR
可能な限り、DB依存になるような構文を書きたくないんだけど
DB依存構文検出チェッカーみたいなのって、世の中にある?
952 :
NAME IS NULL:2013/06/09(日) 13:39:06.60 ID:DY/9Y4Gb
MySQLについての質問です。
highscoreというテーブルに、id, scoreという2つのカラムがあります。
idのインデックスはPRIMARYです。
POSTでidとscoreの値が送られてきたとき、
そのidが既に登録されている場合、送られてきたscoreが登録されているscoreより大きければ、そのidのscoreを更新し、
送られてきたidがまだテーブルに存在しなければ、新規レコードとしてINSERTしたいのですが、
条件分岐の部分でどのようなSQLを書けばよいのか検討がつきません。
何かヒントをいただければ幸いです。よろしくお願いします。
SQLじゃなくてストアドでやる話。
そんなたいそうなもんじゃなかろう。
やり方は色々思いつくけど、SQL文を2つ発行するのが初心者向けかな。
SQL二つ発行するのは、本来なら分離レベルとかロック制御とか考慮しないといかん
最近のDBMSなら1文で出来るやつもあるから、MySQLで使えるかどうか調べてみたら
upsertとか、mergeとか言われてるやつな
>>952 idが 1 で、入れようとしている score が 9999 の場合
INSERT INTO highscore (id, score) VALUES (1,9999)
ON DUPLICATE KEY UPDATE score = IF(score<9999, 9999, score);
でできると思います。
存在しない id ならそのまま INSERT、存在する id ならば IF で
DBの score より大きければその値を、同じか小さければ元の値でUPDATE。
ちょっとスマートじゃないね。
958 :
952:2013/06/09(日) 17:45:07.54 ID:???
御回答いただいた皆様大変ありがとうございました。
>>957さんの方法で実装できました。
scoreが更新されていなくてもUPDATEするのが無駄に思えますが、
とりあえずこれで運用してみます。
ストアドプロシージャについても調べてみます。
ありがとうございました。
959 :
NAME IS NULL:2013/06/13(木) 04:44:36.45 ID:gtAIlzh6
質問させてください
アマゾンとかでよくある商品の評価ポイントを集計するクエリを作りたいです
アマゾンと少し違うのは、商品そのものの評価ポイントではなく、
商品を登録した出品者くくりでの、「その出品者が出品した全ての商品の評価ポイント」の平均値をとることです
まとめると、
・特定の出品者の出品した商品の評価ポイントの平均値をとる
・同時に、レビューの件数をとる
・判明してるキーはt_prof.keyのみです
テーブルは以下の通り。
レビューtable =t_review
===============================
reviewId -- int(11) :プライマリキー、auto_increment
workId -- int(11) :商品のID
userId -- int(11) :出品者のID
point -- tinyInt(1):評価ポイント(1〜5)
出品者プロフィールtable =t_prof
===============================
userId -- int(11) :プライマリキー、auto_increment
namae -- text :出品者の名前
key -- int(3):キー。ユニーク
どんなクエリを書いたらいいんでしょうか
すみません、よろしくお願いします
1回の出品に対する評価は何回?
複数のの出品者が「同じ商品」を複数個出品することがある?
「判明しているキー」に「プライマリーキー」が含まれていないが?
「サンプルデータ」と「欲しい結果」を出してくれ
これだけなら、出品者IDでgroup byしてavgとcountでよくないか?
where userId = (select userId from t_prof where key = 判明しているキー)
select p.namae,avg(r.point),count(r.point) from t_review r,t_prof p where r.userid=p.userid group by r.userid;
こんなんでどお?
動かしてないけど、p.namaeがgroup byにないってエラーがでそう。
mysqlだったらどれかひとつが勝手に選ばれるという話だったかも
>>959 t_prof.keyは何に対してユニークなんだ
評価はNULLはあり得るのかとかその場合は評価件数に加えるのかとか
いろいろ詰まってないところがあるが
select t_prof.userId,count(*),avg(point)
from t_review join t_prof on t_review.userId=t_prof .userId
where t_prof.key=判明してるキー
group by t_prof.userId
とかで良いんじゃね
始めたばかりでググりましたがよくわかりません
結果がなしなのを0で返したいのです
T-sql
select @test=data from db where 除外内容
宣言済のtestに0か数字を入れたいのです
sumなりで返せばいいだろ。
>>966 SQLの話から外れるけど、ホスト言語側で大概、結果のレコード数を返す
関数が用意されているから、それで見るのが比較的常套だと思うけど。
それをサブクエリーにして、レコード数を集めたりしているのであれば
count()を使えばいいんじゃないかね。
>>966 ISNULL関数使え
つか特定DBの話はそこで聞け
>>967 SUMは対象が全てNULLならNULL返す
>>968 あれレコード数見てるんじゃないぞ
970 :
959:2013/06/14(金) 23:24:15.62 ID:???
>>960-965 ありがとうございます
COUNTやAVGの使い方を復讐しつつそれぞれ参考にさせていただきます
復讐は何も生まないよ
Revengeコマンド、作る?
Living Well Is The Best Revenge
974 :
NAME IS NULL:2013/06/15(土) 16:04:10.91 ID:FktO2NAp
どなたかお願いいたします。
私初心者で「ゼロから始めるデータベースSQL」という本で勉強をしています。付属のソフトをインストールしてパスワードを入れて書いてある通りにやってるんですが最初のテーブルを作るところでエラーが出てしまい困ってます。
Create table shohin;
と入れると
";"またはその近辺でエラーと出ます。
これはなぜでしょうか。
よろしくお願いします。
975 :
NAME IS NULL:2013/06/15(土) 16:15:53.30 ID:FktO2NAp
すみません。
中身何も入れてないからか!?と思い、書いてある通りに入れたら、
プライマリキーはテーブル"shohin"に暗黙的なインデックス"shohin_pkey"を作成します
と出たのですが、これはテーブルを作成できたんでしょうか
976 :
NAME IS NULL:2013/06/15(土) 16:19:55.22 ID:FktO2NAp
ごめんなさい。
できてるみたいです
日本語でおKって話ですよね
初心者すぎました
すみません!
書いてる通りにやってないだろ。
初心者に素直さを期待してはいけない
本当の初心者は、めんどくさそうな手順は後からやろうと飛ばすものだ。
問題は飛ばしたことをすっかり忘れることだなw
981 :
NAME IS NULL:2013/06/16(日) 15:21:55.25 ID:uKsaBYgK
中身何も入れてないってどういうこっちゃ?
データベース作ってないのにテーブル作ろうとしたのかこいつ
> Create table shohin;
って書いてるだろうw
>>981 カラム定義
列は後回しにして、とりあえずテーブルを作ってみようって思ったのかも。
斬新な発想だな。
プロには想像もつかない。