X



トップページDB@2ch掲示板
1002コメント319KB
SQL質疑応答スレ 18問目
■ このスレッドは過去ログ倉庫に格納されています
0001NAME IS NULL
垢版 |
2018/01/04(木) 22:12:22.14ID:???
このスレは
「こういうことをやりたいんだけどSQLでどう書くの?」
「こういうSQLを書いたんだけどうまく動きません><」
などの質問を受け付けるスレです。

SQLという言語はISOによって標準化されていますが
この標準を100%実装したDBMSは存在せず、
また、DBMSによっては標準でない独自の構文が
追加されていることもあります。

質問するときはDBMS名を必ず付記してください。

【質問テンプレ】
・DBMS名とバージョン
・テーブルデータ
・欲しい結果
・説明

前スレ:
SQL質疑応答スレ 17問目
https://mevius.5ch.net/test/read.cgi/db/1468157341/
0304NAME IS NULL
垢版 |
2018/05/04(金) 21:31:51.25ID:???
主キーでなくてもUNIQUE制約がついていれば大丈夫だと思う
0305NAME IS NULL
垢版 |
2018/05/04(金) 22:29:19.11ID:GLAEl09j
>>303
>>304
これ自分も知りたいからageてみるか
0306NAME IS NULL
垢版 |
2018/05/05(土) 00:10:26.39ID:T65X27xi
>>303
一意制約の列でもよい。要は重複値を持っている列では外部キー制約に使用できない。
0307303
垢版 |
2018/05/05(土) 01:36:42.07ID:dfGZW7dT
>>304
>>306
ありがとうございますm(_ _)m
0308NAME IS NULL
垢版 |
2018/05/10(木) 23:54:50.05ID:???
DB殆ど触ったことないので分からないのですが、
1. SQLでは[ユーザー名, パスワード, [データA], [データB]] (便宜的にリスト形式にしています)
のようなDB構造は作れるのでしょうか?

つまり、ユーザー名とパスワードは1ユーザに1つずつ、データA,B,C、、、は内部に複数のデータを持つような構造です
ちなみに扱いたいSQLはpostgreSQLです

2. node.jsとpostgreSQLを使ってウェブアプリを作ろうと思っているのですが、postgreSQLでは最初にDB構造の宣言などはしなくて良いのでしょうか?

Swift + RealmでDBを使った際には、ユーザーモデルっていうDB構造?を宣言してから使ったので、少々混乱しています

3. node.jsとpostgreSQL(npmで)をWindowsにインストールしたのですが、postgreSQLが動きませんでした
WindowsにもpostgreSQLをインストールしなければいけないのでしょうか?


よろしくお願いします
0309NAME IS NULL
垢版 |
2018/05/11(金) 03:50:27.46ID:JrURJydT
MySQLです。数値を計算するSQL文ってあるでしょうか?

例えば、rankingテーブルに「access」と「click」というカラムがあるとします。
accessは×1でclickは×5にして、その合計数値が多い値(降順)で表示

みたいなことがしたいです。
0310NAME IS NULL
垢版 |
2018/05/11(金) 05:53:20.74ID:6wqBIw87
>>308
まずはDBを触りましょう
SQLではと書いているということは他ならわかるのでしょうか
RDBでは一般的に
[ユーザーID,ユーザー名,パスワード]
[ユーザーID,データ番号,データ]
のようなテーブルを作成してユーザーIDで結合します
これを正規化といいます

>>309
素直に
order by (ranking.access + ranking.click * 5) desc
でいけるかと
0311NAME IS NULL
垢版 |
2018/05/11(金) 17:09:15.29ID:???
SQL初心者です。
連続して1が立っている時間
(行数、データ数)は求められないでしょうか。
1が出てきたタイミングで後どれだけ続くかをその行に書き込みたいです。
0312NAME IS NULL
垢版 |
2018/05/11(金) 21:47:33.52ID:???
>>310
いけました!orderに計算するって概念がありませんでした。
とても勉強になりました。ありがとうございます
0313NAME IS NULL
垢版 |
2018/05/12(土) 09:16:12.16ID:???
>>311
どういうテーブル、イメージしてるデータの並びを書かないとレスつかないんじゃないか
0314NAME IS NULL
垢版 |
2018/05/12(土) 20:19:54.53ID:???
>>313
ありがとうございます。

A B
0 0
0 0
1 3
1 0
1 0
0 0
0 0

AからBを作りたいです。
Bの3は1が3つ続いていることを意味します。
0315NAME IS NULL
垢版 |
2018/05/12(土) 21:14:06.97ID:???
>>314
順序も規定せずに 「続いてる」とか言われてもなあ
Excel + VBA とかでやれば?
0317NAME IS NULL
垢版 |
2018/05/12(土) 21:39:12.17ID:???
>>315
>>316
No A B
0 0 0
1 0 0
2 1 3
3 1 0
4 1 0
5 0 0
6 0 0
7 1 2
8 1 0
9 0 0

例えばこの様な連番が有れば出来るものでしょうか。

すみません。
SQLで出来るのか?
出来るならどのような方法が有るのか
知りたいです。

よろしくお願いします。
0318NAME IS NULL
垢版 |
2018/05/12(土) 22:16:46.98ID:???
>>317
これで
2 1 3
7 1 2
がとれたらいいわけ?
時間っていってたわりにはそういう結果をかいてないが
0319NAME IS NULL
垢版 |
2018/05/12(土) 22:19:25.26ID:???
あとDBは何かしりたい
0320NAME IS NULL
垢版 |
2018/05/12(土) 22:28:15.77ID:???
最新の(つまりinsertする前の)NoでAが1で、かつ追加するデータのAが0だったら
直前のAが0のデータのNoを見る
例ならNoが9の時に0になったから直前のAが0のデータはNoが6だと。
んで、7,8が連続したものだった
だからNo7のBに2をセット

こんな感じ?
0321NAME IS NULL
垢版 |
2018/05/12(土) 23:17:44.19ID:???
>>318
分かりにくく申し訳ありません。
元々時系列のデータだったので
時間という書き方をしていました。
(何個続いたか知りたいのです)

NOとAの項目がある状態でBの項目
を追加したいと思っています。

318様のような結果でも構いません。

>>319
MSのSQL Serverです。申し訳ありませんが詳細なバージョンなどは不明です。

>>320
ありがとうございます。
書かれているようなことが
実現できればと思います。
0322NAME IS NULL
垢版 |
2018/05/12(土) 23:18:49.98ID:???
>>317
SQL文でやるならレコードを次々と参照しないといけないから再帰SQL使わないとだめだろうな
あるいはプロシージャでカーソル使う
あるいはプログラムでやる感じになる
0323NAME IS NULL
垢版 |
2018/05/13(日) 00:03:02.98ID:???
SQL Serverでなく、MySQLです、済みません。テーブル名はtと仮定しました。

create procedure setB()
begin
 declare done int;
 declare _flag int;
 declare _cnt int;
 declare _a int;
 declare _no int;

 declare cur cursor for select No,A from t order by No desc;
 declare exit handler for not found set done = 0;
 set done = 1;
 set _flag = 0;
 set _cnt = 0;
 
 open cur;
 while done do
  fetch cur into _no, _a;
  if _a = 1 and _no > 0 then
   update t set b = 0 where No = _no + 1;
   set _cnt = _cnt + 1;
  else
   update t set b = _cnt where No = _no + 1;
   set _cnt = 0;
  end if;
 end while;

 if _a = 1 then
  update t set b = 0 where No = _no;
 else
  update t set b = _cnt where No = _no;
 end if;
 close cur;
end;
0324NAME IS NULL
垢版 |
2018/05/13(日) 05:37:55.80ID:???
>>322
ありがとうございます。
教えていただいたキーワードをもとに
調べてみます。

>>323
ありがとうございます。
今はPCをさわれる環境にないので月曜日に試してみたいと思います。
0325NAME IS NULL
垢版 |
2018/05/13(日) 07:21:58.29ID:???
>>322
再帰やストアドなんて要らんでしょ
>>318 の結果を得たいだけなら

select
 T1.NO, T1.A,
 (
  select min(T3.NO) as NO
  from T as T3
  where T1.NO < T3.NO and T1.A <> T3.A
 ) - T1.NO as [連続数]
from T as T1
inner join T as T2 on T1.NO - 1 = T2.NO and T1.a <> T2.a
where T1.A = 1

で十分でしょ (わかると思うけど表名は T ね)
0326NAME IS NULL
垢版 |
2018/05/13(日) 09:51:48.44ID:???
>>325
ありがとうございます。
試してみます。
0327NAME IS NULL
垢版 |
2018/05/13(日) 11:09:02.63ID:???
再帰SQLでやるならこんな感じ
最初に1がでたところで表示したいとのことなので
レコードの最後から加算積み上げてる
半角でレスしようとしたらインジョクションかなんかでエラーになった
ため全角に変換してます

WITH CTE AS (
SELECT NO,A,A AS B 
FROM TBL AS M

UNION ALL 
SELECT M.NO ,M.A ,S.B + 1 AS B −−Bを1で積上げていく
FROM TBL AS M
inner join CTE AS S
on  M.NO = S.NO −1 −−レコードの後ろから参照
and S.A = 1
and M.A = 1

), [WK1] AS (
SELECT NO,A,max(B) as B −−Bが積上開始位置により別々の数字になっているので最大値でサマリー
FROM CTE AS M
GROUP BY NO,A


SELECT M.NO,M.A,case when S.A = 0 then B else 0 end B −−前のレコードがゼロの時のみBを表示
FROM [WK1] AS M
LEFT JOIN TBL AS S
on M.NO −1 = S.NO 
ORDER BY M.NO
0328NAME IS NULL
垢版 |
2018/05/14(月) 10:07:01.26ID:???
>>325
>>327
ありがとうございます。どちらも思ったような結果が得られました。
>>323
ありがとうございます。
今回は動かせていませんが、MySQLをさわる機会に試してみます。

4月末よりSQLを使わなければいけなくなり、困っていました。
皆さんに教えていただいた方法を理解し自由にSQLが書けるよう頑張ります!
0329NAME IS NULL
垢版 |
2018/05/17(木) 11:36:55.43ID:???
教えて下さい。

下記の表Tに於いて
NO,START,STOPが与えられているとき
KEKKAという行を得たいです。
良い方法があれば教えてください。
(STARTからSTOPの間に1を立てたい)
DBはMicrosoft SQL Serverです。

NO START STOP KEKKA
1 0 0 0
2 0 0 0
3 1 0 1
4 0 0 1
5 0 0 1
6 0 1 1
7 0 0 0
8 0 0 0

よろしくお願いします。
0330NAME IS NULL
垢版 |
2018/05/17(木) 15:57:54.69ID:???
>KEKKAという行を得たい

????????
0331NAME IS NULL
垢版 |
2018/05/17(木) 16:33:50.08ID:???
>>330
わかりにくくてすみません。
KEKKAという項目は元のデータにはなく、この項目を生成したいです。
0332NAME IS NULL
垢版 |
2018/05/17(木) 19:41:40.74ID:???
STARTとSTOPは1件ずつしかないのか?

順序はNO順でいいのか?
NOは連番なのか?
0333NAME IS NULL
垢版 |
2018/05/17(木) 22:05:10.46ID:???
START、STOPは必ず1レコードあり、複数はない
って事なら、簡単なSQLで処理できそう
0334NAME IS NULL
垢版 |
2018/05/17(木) 22:12:42.54ID:???
>>332
STARTとSTOPは複数あります。
NO順です。
NOは連番です。
STARTが1である行とSTOPが1である行は必ず交互に来て、
STARTとSTOPが同時に来ることはありません。
STARTが1の行とSTOPが1の行は続くことがあります。
STOPが1の行の直後にSTARTが1の行が来る場合もあります。
STARTが1の行の数とSTOPが1の行の数は同じです。
NO順に先頭から見ていくと、STARTが1の行は、STOPが1の行より先に出現します。

よろしくお願いします。
0335NAME IS NULL
垢版 |
2018/05/17(木) 22:21:17.05ID:???
>>334 で何をやりたいかはだいたいわかったけど
(たぶん STARTしてからSTOPするまで KEKKAを1にすればよいはず)
行順を保持しつつ状態遷移させるのって普通のSQLでできるのだろうか?
0336NAME IS NULL
垢版 |
2018/05/17(木) 22:27:50.57ID:???
START、START、STOP、STOPって並びになったときはどうすんの?
0337NAME IS NULL
垢版 |
2018/05/17(木) 22:28:51.14ID:???
334見てなかった、すまん
0338NAME IS NULL
垢版 |
2018/05/17(木) 22:51:31.55ID:???
>>334
スタートがあったら1加算ストップがあったら1減算する累積計算すればいいじゃねえ
select no sum( start + end * -1) as kekka from t as m
left join t as s
on t.no<=m.no
group by no
0339NAME IS NULL
垢版 |
2018/05/18(金) 01:30:58.99ID:???
>>338
いろいろ細かいミスは置いといて、それSTOPの行が1にならんだろ

>>329
select NO,START,STOP,
(select isnull(sum(START),0) from t where t.NO <= m.NO)-
(select isnull(sum(STOP),0) from t where t.NO < m.NO) KEKKA
from t m
とかで出来んじゃね
0340NAME IS NULL
垢版 |
2018/05/18(金) 10:08:58.76ID:???
ありがとうございます。
皆さんに教えていただいた方法を試していますが、うまく行きそうです。
ありがとうございました。
0341NAME IS NULL
垢版 |
2018/05/18(金) 17:13:55.57ID:???
・DBMS名とバージョン
10.1.16-MariaDB

・テーブルデータ
テーブル:categories
cateid  catename   
----------------
1     c1
2     c2
3     c3
4     c4
5     c5
6     c6
7     c7
8     c8

テーブル:books
cateid  bookname price
--------------------
1     b11     20
1     b12     10
1     b13     30
1     b14     40
1     b15     5
2     b21     20
2     b22     10
2     b23     30
2     b24     40
2     b25     5


・欲しい結果
cateid   catename bookname price
--------------------------------
1     c1      b14     40
1     c1      b13     30
1     c1      b11     20
2     c2      b24     40
2     c2      b23     30
2     c2      b21     20

・説明
categoriesとbooksをcateidで結合。結合の順番はbooksのpriceの降順とし、更にその結合する数の上限を3としたいのですが、どういうSQLになりますか?

ちなみに↓のようなSQLを思いつきましたが上手く行かず・・・
SELECT *
FROM categories
    LEFT JOIN (SELECT * FROM books ORDER BY price DESC LIMIT 3) books
    ON (books.cateid = categories.cateid)
priceでのソートはできてるんですが、LIMITが期待通りには機能しませんでした
まあそれもそのはず・・・これではbooksテーブル全件の上位3件を拾ってこいというクエリですからね
0342NAME IS NULL
垢版 |
2018/05/18(金) 21:21:55.34ID:???
select
 t1.cateid, catename, t1.bookname, t1.price
from books t1
join category c on c.cateid=t1.cateid
where 3 >= (
 select count(*)
 from books t2
 where
  t1.cateid = t2.cateid and
  t1.price <= t2.price
)
order by cateid, price desc;
0343NAME IS NULL
垢版 |
2018/05/20(日) 02:31:03.55ID:???
>>342
できました!ありがとうございます!
0344NAME IS NULL
垢版 |
2018/05/29(火) 11:29:58.81ID:???
table data_pool
code bb_date   baibai  suuryou
111  2018/04/01   3  2000
111  2018/04/03   1  1000
222  2018/04/05   3  1000
222  2018/04/09   3  2000
333  2018/05/01   3  5000

(PK code + bb_date)
baibai 1 売り 3 買い
月単位で集計するときにbaiba=1はマイナスとして集計し
111  2018/04  1000
222  2018/04  2000
333  2018/05  5000
のような結果を得たいのですがどう書けばいい?(mysql)
0345344
垢版 |
2018/05/29(火) 11:31:34.61ID:???
間違い
222  2018/04  3000
です
0346NAME IS NULL
垢版 |
2018/05/29(火) 12:22:53.17ID:x6Mfbf1/
こういう時に間違える人って
0347NAME IS NULL
垢版 |
2018/05/29(火) 12:41:29.95ID:???
おっちょこちょいなんだろうな
> baiba=1
とか書いてるし w
でも、欲しい結果をちゃんと書いてるのはいいことだと思う

MySQLはよく知らんけど
select
code,
date_format(bb_date, '%Y/%d'),
sum(
case baibai
when 1 then -suuryou
when 3 then suuryou
end
)
from data_pool
group by code, date_format(bb_date, '%Y/%d')
とかで行けるんじゃね?
0348NAME IS NULL
垢版 |
2018/05/29(火) 14:04:09.72ID:???
date_format の所、%Y/%m だな。
2カ所直せば大丈夫だろう
0349344
垢版 |
2018/05/29(火) 14:07:06.19ID:???
重ね重ねの間違いお恥ずかしいw
有難うございます
%d を %m にして欲しい結果を得ることが出来ました。感謝
0350NAME IS NULL
垢版 |
2018/05/31(木) 20:59:32.14ID:???
毎日の果物の価格を記録するデータベースを作りたいんですがどういうテーブルをつくったらいいですか?とりあえずitemsテーブルに果物の種類とidのカラムを作ります。
毎日の価格はどういうテーブルにしたらいいですか?
0354NAME IS NULL
垢版 |
2018/05/31(木) 21:21:57.55ID:???
被ってしまった、すまん
0355NAME IS NULL
垢版 |
2018/05/31(木) 21:27:38.54ID:???
>>354
ありがとうございますそっちで聞いてみます、
0356NAME IS NULL
垢版 |
2018/05/31(木) 22:01:13.46ID:???
まあどっちの住人もたいして変わらんからここでも良いとは思うけど
> 毎日の果物の価格を記録するデータベースを作りたいんです
とか意味がわからん
そのデータベースでどう言うことをしたいいのか、とかどういう結果が欲しいのかを書けよ...
0357NAME IS NULL
垢版 |
2018/05/31(木) 22:14:37.43ID:trgN2RKZ
またバカがごねとるw
0358NAME IS NULL
垢版 |
2018/06/01(金) 05:31:44.28ID:VfzZdde5
クリエ通知ってどうやるの?
0359NAME IS NULL
垢版 |
2018/06/06(水) 21:29:03.80ID:???
relatedなカラムにむこうのテーブルにないものをinsertすると勝手に登録してくれますか?
0360NAME IS NULL
垢版 |
2018/06/07(木) 14:54:12.56ID:???
しばらく考えてしまったが
やはり意味が分からなかった
誰か解説頼む
0361NAME IS NULL
垢版 |
2018/06/07(木) 15:10:39.40ID:???
リレーションで外部キーに存在しないものを挿入したら
どうにかしてくれるのかってことだべ
制約にならんと思うんだが、、、トリガで自分で追加するようにすればいけるかもね
0362NAME IS NULL
垢版 |
2018/06/08(金) 03:47:57.75ID:Ywf/F+oU
皆さんがアンケートの答えを格納するテーブルを作るとしたら
未回答は、nullを想定しますか?0を想定しますか?
理由も教えてください!
0364NAME IS NULL
垢版 |
2018/06/10(日) 09:42:21.89ID:???
>>361
on insert cascade か。他のカラムはどうすんだろ
0365NAME IS NULL
垢版 |
2018/06/10(日) 10:20:33.83ID:???
null なり default 値なりにするんだろ
0366NAME IS NULL
垢版 |
2018/06/10(日) 20:58:20.60ID:???
主キーはどうするんだ
0367NAME IS NULL
垢版 |
2018/06/10(日) 21:58:41.22ID:???
>>366
identity とかでいいだろ
てか insert と同じだろ
0368NAME IS NULL
垢版 |
2018/06/14(木) 13:13:32.45ID:???
自動採番のあるテーブルにインサートした場合、その番号を知るには別途selectするものですか?
0369NAME IS NULL
垢版 |
2018/06/14(木) 16:10:12.12ID:???
そもそも自動採番ってSQL標準じゃない気がするし
DBMSによるんじゃね
0370NAME IS NULL
垢版 |
2018/06/14(木) 18:37:24.82ID:???
>>368
普通は採番された番号を取得する機能が提供されてる
でないと単純なログみたいにその番号以外の部分には重複を許す列しかないと検索しようがないから
0371NAME IS NULL
垢版 |
2018/06/15(金) 10:36:36.02ID:???
>>368 です。
自分の使うデータベースで探したらありました。
自動採番ってあるの普通だと思ってたので勉強になりました。
0372NAME IS NULL
垢版 |
2018/06/17(日) 00:34:30.36ID:DF4YrmFv
こういう常時、一人しか使っていないと思っているひとは、なんなんだろうな。
0373NAME IS NULL
垢版 |
2018/06/17(日) 00:58:11.39ID:YrBEhWbQ
こういう常時、で読点打つキチガイはバカなんだろ、うな。
0374NAME IS NULL
垢版 |
2018/06/17(日) 11:52:51.97ID:???
バカだからイミフなんですね
0375NAME IS NULL
垢版 |
2018/06/19(火) 19:16:06.54ID:???
n+1問題ってなんやねん

パフォーマンス低下したら何がいけないの?
0376NAME IS NULL
垢版 |
2018/06/19(火) 19:17:03.49ID:???
何回もデータ分だけ引くの何がいけないの?
ハードが優秀なら別にいいんじゃないないの?
0377NAME IS NULL
垢版 |
2018/06/19(火) 23:22:26.54ID:NrZ3i0Js
それでええんやで
0378NAME IS NULL
垢版 |
2018/06/24(日) 19:08:35.72ID:???
助けてください。自分の力量だと解決できず

データ
日付,オーダ番号,個人名.エラーA,エラーB,エラーC
0601,00001,タナカ,エラーA発生,,
0601,00002,イトウ,,エラーB発生,
0601,00003,サトウ,,,エラーC発生
0602,00004,タナカ,エラーA発生,,
0602,00005,イトウ,エラーA発生,,
0602,00006,スズキ,エラーA発生,,

このとき、個人別にエラー回数の内訳を出したいのです。
個人名, エラー1回目, エラー2回目, エラー3回目,…
タナカ,エラーA,エラーA,,
イトウ,エラーB,エラーA,,
サトウ,エラーC,,
スズキ,エラーA,,

使用DBはMYSQLですがストアドは使えないという制約があり
エラー回数は動的に延ばせればという要望がありますが、5回で止めてもOKです。

よろしくお願いいたします。
0379NAME IS NULL
垢版 |
2018/06/24(日) 21:18:41.09ID:???
select
個人名,
max(case カラム番号 when 1 then エラー end) as エラー1回目,
max(case カラム番号 when 2 then エラー end) as エラー2回目,
max(case カラム番号 when 3 then エラー end) as エラー3回目,
max(case カラム番号 when 4 then エラー end) as エラー4回目,
max(case カラム番号 when 5 then エラー end) as エラー5回目
from (
select
個人名,
case
when not エラーA is null then 'エラーA'
when not エラーB is null then 'エラーB'
when not エラーC is null then 'エラーC'
end as エラー
row_number() over (
partition by 個人名
order by 日付 asc, オーダ番号 asc) as カラム番号
from エラー履歴
)
group by 個人名
0380NAME IS NULL
垢版 |
2018/06/25(月) 19:53:25.00ID:???
よろしくお願いします。
0381NAME IS NULL
垢版 |
2018/06/25(月) 21:07:08.21ID:???
こちらこそよろしくお願いします。
0382NAME IS NULL
垢版 |
2018/06/25(月) 22:01:22.79ID:???
>>379
ありがとうございます!できました!!!
どうしてこんなクエリが思いつくんですか。すげぇですね!
0383NAME IS NULL
垢版 |
2018/06/26(火) 16:30:55.58ID:???
質問です。
tableA
id

tableB
id, A.id

tableC
B.id, col1

のような、A-B-Cと、親-子-孫の関係で、子孫になるほど関連する行が1対多数になっていくテーブルで、

Bの1レコードにたいして、Aの情報と、Cのcol1がnullでない数の情報が欲しいのですが、
LEFT OUTER JOINでどう書けばいいでしょうか?

SELECT t1.x, t2.x, t3.nullでない数
FROM B t1
LEFT OUTER JOIN A t2
ON t1.A.id = t2.id
LEFT OUTER JOIN
(SELECT COUNT(col1) AS nullでない数 FROM C WHERE Bid = t1.id) t3
ON t3.B.id = t1.id

みたいな事がやりたいのですが、クエリはエラーになってしまいます。
0384383
垢版 |
2018/06/26(火) 16:58:48.22ID:???
FROM C WHERE Bid = t1.id) t3
の部分で、「t1はここから参照できない」みたいなエラーです。
0385383
垢版 |
2018/06/26(火) 17:50:23.15ID:???
自己解決しました
(SELECT B.id, COUNT(col1) AS nullでない数 FROM C GROUP BY B.id) t3
として、WHERE句を取ればいいだけでした

無駄な検索時間は増えてしまうと思いますが・・・
0386NAME IS NULL
垢版 |
2018/06/27(水) 01:56:23.14ID:???
>>385
カラム名を変えさせてもらった
tableB id, A_id
tableC B_id, col

select tableA.id, tableB.id,
count(C.col) as count
from tableA,tableB,
(select
B_id,
(case
when col1 is NULL then NULL
else 1 end) as col
from tableC) as C
where
tableA.id=tableB.A_id and
tableB.id=C.B_id and
C.c is not NULL
group by A_id,C.col;
0387NAME IS NULL
垢版 |
2018/06/27(水) 02:05:38.77ID:???
訂正 最後から2行目

× C.c is not NULL
○ C.col is not NULL
0388NAME IS NULL
垢版 |
2018/06/27(水) 08:42:50.79ID:???
>>383
BCを先にjoinしてカウント。その結果とAをjoin
0389NAME IS NULL
垢版 |
2018/06/27(水) 11:12:53.09ID:???
お願いします。
質問文を入力すると403 Forbiddenとなるのですが、なぜでしょう?
こういう文章は入力できるのに・・・
0390NAME IS NULL
垢版 |
2018/06/27(水) 11:16:55.56ID:???
再度質問を投稿してみます。

CREATE TABLE TB(
MM VARCHAR(81) DEFAULT ’NOTHING’ NOT NULL)

なのですが、DEFAULTで'NOTHING'が設定されていてNULLにならないと思うのですが
文末にNOT NULL制御を掛けているのはなぜなのでしょうか?
0391NAME IS NULL
垢版 |
2018/06/27(水) 12:49:39.15ID:???
>>390
> NULLにならないと思うのですが
NULLは後からでも設定できるだろ
0392NAME IS NULL
垢版 |
2018/06/28(木) 05:17:45.28ID:???
>>390
insertでカラムにnull指定すれば出来るからでは
0393NAME IS NULL
垢版 |
2018/06/28(木) 09:25:57.73ID:???
>>391
>>392
ありがとうございました!言われると恥ずかしいくらい簡単なことだったのですね。先生方、ありがとうございました。
0394NAME IS NULL
垢版 |
2018/07/02(月) 08:04:38.26ID:NPOvlBFE
1時間に1回だけ引けるガチャを実装したいんだけどどうすればいいですか?
一応、ユーザがいつガチャを引いたかを記録するテーブルを作って(不正が分かるように必須)
そこから検索かけて該当するのがあれば残り時間を返すみたいな実装を考えてます

・MariaDB 10
・user_id, time
・残り時間(引ける時はいらない)
0396NAME IS NULL
垢版 |
2018/07/14(土) 15:21:18.46ID:wB+JUIy4
条件1〜条件10のうち9個以上の条件を満たすものを抜き出したい。

select * from table1 where 条件;

の条件のところに
(条件1 AND 条件2 AND ...AND 条件10)
AND
(条件1 AND 条件2 AND ... AND 条件9 AND (NOT 条件10))
AND
(条件1 AND 条件2 AND ... AND 条件8 AND (NOT条件9) AND 条件10)
AND
...
AND
((NOT 条件1) AND 条件2 AND ... AND 条件10)

と愚直に11通り書く他に、スマートに書く方法無いの?
0397NAME IS NULL
垢版 |
2018/07/14(土) 15:48:00.68ID:???
where case when 条件1 then 1 else 0 end
   + case when 条件2 then 1 else 0 end
   ...
   + case when 条件10 then 1 else 0 end
   >= 9
0398NAME IS NULL
垢版 |
2018/07/14(土) 16:33:57.42ID:???
なるほど、CASE式を使うのか。 サンQ

ってか質問のころ、11通りを結ぶのはANDじゃなくてORの間違いだったな。
0399NAME IS NULL
垢版 |
2018/07/16(月) 18:50:59.75ID:XzzcYhc4
>>398
複数のselect文を書いてunion allの方が意図がわかりやすいうえに、条件を変えるときも変更時のリスクも低い。
0400NAME IS NULL
垢版 |
2018/07/16(月) 19:13:40.21ID:???
>>399
ちょっと具体的に書いてみ

まともな頭持ってたら書いてる途中で顔真っ赤になると思うが…
0401NAME IS NULL
垢版 |
2018/07/16(月) 19:16:01.66ID:???
>>399
条件ちゃんと読んでないのかもしれんが、複数条件つなぐのはorだぞ
ちょっとunionで書いてみてくれよ
0402NAME IS NULL
垢版 |
2018/07/16(月) 20:50:23.35ID:???
単純に、orでつないでる式を一つにしたsql文をunionすれば良いと思うのだが
0403NAME IS NULL
垢版 |
2018/07/16(月) 21:32:24.07ID:???
>>402
それのどこが「スマート」なんだ?
■ このスレッドは過去ログ倉庫に格納されています

ニューススポーツなんでも実況