質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

2回答

408閲覧

より多くの検索条件が一致する順でソートしたい

tosh08

総合スコア12

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2022/09/07 01:25

SELECT時、OR演算子で複数の条件を指定した場合、
指定された条件のどれか一つに一致するレコードが全て抽出されますが、
そのうち一つの条件しか一致しない場合でも、全て一致する場合でも等しく抽出されます。
これを、条件が一致している数でソートする方法はないでしょうか?
つまりOR条件を五つ指定した場合、五つとも一致するレコードは先頭に、
四つ一致するレコードはその後に来る様にして
一つしか一致しないレコードは末尾に来る様にしたいのです。
抽出したレコードをソースコードで一件ずつ検証して点数付けすれば可能ですが、
SQLだけで完結できる方法があれば大変有難いです。
よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yambejp

2022/09/07 01:30

SQLの種類とバージョンによります。想定する環境とサンプルデータを例示した方が良いと思います
guest

回答2

0

sql

1with 2 a as (SELECT id FROM data where 読み like 'あ%'), 3 b as (SELECT id FROM data where 読み like 'か%'), 4 c as (SELECT id FROM data where 読み like '%さ%'), 5 d as (SELECT id FROM data where 読み like '%た'), 6 p as (select * from a union all select * from b union all select * from c union all select * from d), 7 x as (select count(*) _cnt, id from p group by id), 8 y as (select x._cnt, data.* from x join data on data.id = x.id), 9 z as (select distinct * from y order by _cnt desc) 10 select id, 読み from z;

dataにキーとなる項目(id)が存在すると仮定して、
それぞれの条件で検索し、
union allで連結し、
件数を数え、
件数とデータをidでjoinし、
件数の降順に並び替え、
件数を取り除く。

投稿2022/09/07 02:18

編集2022/09/07 02:22
shiketa

総合スコア3971

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tosh08

2022/09/07 02:58

回答ありがとうございます! 実際にできるかどうか試してみようと思います。
guest

0

合致する条件をcaseで処理して和をとりorder by でDESCすればいいでしょう。

たとえばmysqlだとこんな風にかけます

SQL

1create table tbl (id int primary key,c1 int,c2 int,c3 int); 2insert into tbl values 3(1,1,1,1), 4(2,0,0,0), 5(3,0,1,1), 6(4,1,0,0), 7(5,1,1,0), 8(6,0,1,0); 9 10 11select *, 12(c1=1)+(c2=1)+(c3=1) as point 13from tbl 14having point>0 15order by point desc

投稿2022/09/07 01:31

編集2022/09/07 02:51
yambejp

総合スコア114829

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tosh08

2022/09/07 02:05

早速のご回答ありがとうございます! SUMを使うというヒントで調べてみたのですが、まだよく理解できていませんがこんな感じでしょうか? SELECT * (SUM(CASE WHEN 列1 = 'AAA' THEN 1 ELSE 0 END) + SUM(CASE WHEN 列2 = 'BBB' THEN 1 ELSE 0 END) + SUM(CASE WHEN 列3 = 'CCC' THEN 1 ELSE 0 END) + SUM(CASE WHEN 列4 = 'DDD' THEN 1 ELSE 0 END) + SUM(CASE WHEN 列5 = 'EEE' THEN 1 ELSE 0 END)) AS 点数 FROM テーブル order by 点数;
yambejp

2022/09/07 02:51 編集

ごめんなさい、最初にsumと書いたあとはたと気付きsumではなく 単に和をとればいいと思い回答を修正してあります。 処理的にはsumを除いた感じであっていると思います あとはSQLの種類次第というのは当初指摘したとおりです 回答への追記を参照ください
tosh08

2022/09/07 02:57

ありがとうございます! 思いのほか単純なSQLで実現可能みたいですね。 発想力が足りずお恥ずかしい限りです。 この方法で試してみようと思います。
yambejp

2022/09/07 03:00

mysqlはtrueを1/falseを0とみなすので足し算だけでできてしまいます。 SQLとしては特殊な仕様だと思いますので他のSQLをご利用な場合は caseで処理してください
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問