例えば、次のようなテーブルがあって、mojiretuカラムにおいて
他の行の文字列と2文字以上の重なっている部分の文字列を取得したいのです。
ただし条件があって下の場合だと、「ab」は1、2行目で重なっているのですが、
2行目の「ab」はそれで全ての(終結している)文字列なのでマッチさせないようにしたいです。
なので、このテーブルから取得したい文字列は
「cd」「bcd」「abc」「bc」「de」になります。できれば重なっている回数も含めて取得したい
(「cd」2回、「bcd」1回、「abc」1回、「bc」1回、「de」1回、)
のですが、どのようなSQLを記述すれば良いのでしょうか?
[テーブル]
mojiretuカラム
abcd
ab
cde
abcde
xy
No.4
- 回答日時:
ちなみに
SELECT * FROM T_TEMP;
で想定した文字を2文字以上に分割したデータ群はみえてますよね?
>PHP側で$db->query("SELECT MOJIRETU,COUNT(*) -1 AS COUNT FROM T_TEMP GROUP BY
> MOJIRETU HAVING COUNT>0 AND MOJIRETU NOT IN(SELECT MOJIRETU FROM HOGE");
単にシンタックスエラーですね?
ケツにカッコ閉じがぬけてます
PHP側で$db->query("SELECT MOJIRETU,COUNT(*) -1 AS COUNT FROM T_TEMP GROUP BY MOJIRETU HAVING COUNT>0 AND MOJIRETU NOT IN(SELECT MOJIRETU FROM HOGE)");
ご回答ありがとうございます。
なるほど、たしかに最後にある「;」を取り除こうとして
それまで取り除いていました・・・うっかりミスでした・・・すいません。
お陰様で理想的な結果を得ることができました。
ありがとうございます。
No.3
- 回答日時:
あ、一点補足・・・・
INSERTの行はINGNOREにしないとエラーになる可能性があるので以下注意
INSERT INTO T_TEMP(NUM,MOJIRETU) VALUES(a,SUBSTR(b,I,J));
↓
INSERT IGNORE INTO T_TEMP(NUM,MOJIRETU) VALUES(a,SUBSTR(b,I,J));
ご回答ありがとうございます。
>INSERT IGNORE INTO T_TEMP(NUM,MOJIRETU) VALUES(a,SUBSTR(b,I,J));
IGNOREを追加してphpMyAdminでやってみたのですが、
同じようなエラー結果でした・・・
何が別の原因があのエラー文ではあるのでしょうか?
No.2ベストアンサー
- 回答日時:
もっと効率的な方法はあると思いますが、ざっくりとやってみました。
テーブル名などは順次自分の設定と置き換えてください。
(1)検索用のテーブルを設定しておきます。
※とりあえずテーブル名をHOGEとします。
CREATE TABLE HOGE (ID INT NOT NULL PRIMARY KEY,MOJIRETU VARCHAR(30));
INSERT INTO HOGE VALUES(1,'abcd'),(2,'ab'),(3,'cde'),(4,'abcde'),(5,'xy');
(2)テンポラリ用のテーブルをつくります
DROP TABLE IF EXISTS T_TEMP;
CREATE TABLE T_TEMP (
NUM INT,
MOJIRETU VARCHAR(20),
UNIQUE(NUM,MOJIRETU)
);
(3)プロシージャを作成します。
DROP PROCEDURE IF EXISTS INSERT_T_TEMP;
DELIMITER //
CREATE PROCEDURE INSERT_T_TEMP()
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE I , J INT;
DECLARE a INT;
DECLARE b VARCHAR(30);
DECLARE CUR CURSOR FOR SELECT ID,MOJIRETU FROM HOGE;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
TRUNCATE T_TEMP;
OPEN CUR;
REPEAT
FETCH CUR INTO a, b;
IF NOT done THEN
SET J=2;
WHILE J<=LENGTH(b) DO
SET I=1;
WHILE I+J-1<=LENGTH(b) DO
INSERT INTO T_TEMP(NUM,MOJIRETU) VALUES(a,SUBSTR(b,I,J));
SET I=I+1;
END WHILE;
SET J=J+1;
END WHILE;
END IF;
UNTIL done END REPEAT;
CLOSE CUR;
END
//
DELIMITER ;
(4)プロシージャをコールします。
CALL INSERT_T_TEMP();
(5)SQLを発行します。
SELECT MOJIRETU,COUNT(*) -1 AS COUNT FROM T_TEMP GROUP BY MOJIRETU
HAVING COUNT>0 AND MOJIRETU NOT IN(SELECT MOJIRETU FROM HOGE);
ご回答ありがとうございます。
試してみたのですが、次のようなエラーが出てしまいました・・・
>Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1'
一応、下の文をphpMyadminからSQLで挿入して成功して、
PHP側で$db->query("SELECT MOJIRETU,COUNT(*) -1 AS COUNT FROM T_TEMP GROUP BY MOJIRETU HAVING COUNT>0 AND MOJIRETU NOT IN(SELECT MOJIRETU FROM HOGE");
を発行してみたのですが、、、これはどのようなエラーでまた対処方法を教えていただけないでしょうか?
DROP TABLE IF EXISTS HOGE;
CREATE TABLE HOGE (ID INT NOT NULL PRIMARY KEY,MOJIRETU VARCHAR(30));
INSERT INTO HOGE VALUES(1,'abcd'),(2,'ab'),(3,'cde'),(4,'abcde'),(5,'xy');
DROP TABLE IF EXISTS T_TEMP;
CREATE TABLE T_TEMP (
NUM INT,
MOJIRETU VARCHAR(20),
UNIQUE(NUM,MOJIRETU)
);
DROP PROCEDURE IF EXISTS INSERT_T_TEMP;
DELIMITER //
CREATE PROCEDURE INSERT_T_TEMP()
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE I , J INT;
DECLARE a INT;
DECLARE b VARCHAR(30);
DECLARE CUR CURSOR FOR SELECT ID,MOJIRETU FROM HOGE;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
TRUNCATE T_TEMP;
OPEN CUR;
REPEAT
FETCH CUR INTO a, b;
IF NOT done THEN
SET J=2;
WHILE J<=LENGTH(b) DO
SET I=1;
WHILE I+J-1<=LENGTH(b) DO
INSERT INTO T_TEMP(NUM,MOJIRETU) VALUES(a,SUBSTR(b,I,J));
SET I=I+1;
END WHILE;
SET J=J+1;
END WHILE;
END IF;
UNTIL done END REPEAT;
CLOSE CUR;
END
//
DELIMITER ;
CALL INSERT_T_TEMP();
No.1
- 回答日時:
常識的にSQLですることじゃないですね
できないことはないレベルの処理で、非常にめんどくさい割に
パフォーマンスも期待できませんがそれでもやりたいなら例示しますが?
ロジック的にはmojiretuの項目を2文字以上の文字になるよう
抽出する関数をつくり、総当たりでヒットさせるような流れでしょうか
ご回答ありがとうございます。
>パフォーマンスも期待できませんがそれでもやりたいなら例示しますが?
是非お願いしたいです。
ただ自分としてはMySQLなどで滅多に関数を使ったことがないので少し不安ですが、、^^;
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- SQL Server [SQLServer] テーブル名からカラム名を取得する 1 2022/08/23 21:20
- その他(プログラミング・Web制作) プログラミング pythonの問題について 2 2022/04/19 00:41
- その他(データベース) Accessのクエリで1フィールドの抽出条件設定をNullでなく全角半角含む空白のみの文字列でない文 1 2023/04/24 15:20
- Oracle SQLについて教えて下さい。 主キーを持ったカラムを主キーの機能を持たせたまま カンマ区切りで文字列 1 2023/03/27 22:47
- Java Java 南京錠 2 2023/02/04 11:46
- Excel(エクセル) Excel 複数列のある文字を優先して1列に表示したいです 2 2022/12/03 12:07
- Excel(エクセル) capeofdragonと申します Excel2016を使っておりまして 半角又は全角の任意文字列が 2 2022/10/31 13:51
- Excel(エクセル) PowerQueryに詳しい方教えてください(Office365) 1 2022/07/24 21:11
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- その他(データベース) カラム上の重複を削除するクエリを教えてください 3 2022/04/12 14:11
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
テーブルリンク リンク元を知...
-
L2SWはARPテーブルを持っている?
-
一致するデータのみ削除したい
-
外部キーだけのテーブル(主キ...
-
更新されたテーブルを表示したい
-
男性と2人で飲食店に行きテーブ...
-
件数の多い順にselect
-
このテーブルで
-
【エクセル】データテーブルの...
-
テーブルデータのエクスポート...
-
まるいテーブル 円い 丸い 漢字...
-
お金持ちのテーブル
-
今度同じサークルだった女の子...
-
Access 振込手数料計算
-
風水で丸いテーブルはあまりよ...
-
MySQLで複数テーブルを作成する
-
会社の飲み会の幹事になり、座...
-
ExcelからACCESSへ接続するとエ...
-
SQL 外部結合
-
大阪府内できれば南方面で
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
L2SWはARPテーブルを持っている?
-
テーブルリンク リンク元を知...
-
会社の飲み会の幹事になり、座...
-
外部キーだけのテーブル(主キ...
-
飲み会で、座敷orテーブルどち...
-
アクセスのリンクテーブル一覧...
-
複数テーブルにわたるCOUNT
-
男性と2人で飲食店に行きテーブ...
-
「テーブルに座って……」という...
-
複雑なSQL文について
-
まるいテーブル 円い 丸い 漢字...
-
お金持ちのテーブル
-
【PHP】SQL文のSUM関数で出力し...
-
論理名とコメント構文(?)について
-
1つのテーブルに同じデータを参...
-
1対1のリレーション(主キー同...
-
MySQLで複数テーブルを作成する
-
テーブルの白く剥がれてるところに
-
オーダーの覚え方について
-
このテーブルで
おすすめ情報