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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

4回答

1903閲覧

テーブルのレコードをphpで指定した条件で最小限で別々に取得する方法

退会済みユーザー

退会済みユーザー

総合スコア0

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2017/01/16 12:05

編集2022/01/12 10:55

Mysqlのテーブルのレコードをphpで指定した条件で最小限で別々に取得する方法はありませんか?

カムラは2つです
box nakami
A りんご バナナ
B キウイ パイナップル
C りんご
D バナナ パイナップル
E バナナ ライチ
F りんご みかん

このようなテーブルがあったとして条件をりんご、キウイにするとABCFの4つのレコードが取得されますが何か条件などを追加してレコード2つずつABとBCとBFで別々に取得できないかと思って質問しました

修正
「最小限または3つ以下」を「最小限で別々」に修正しました
うまく説明できずすいません

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

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

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

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

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

guest

回答4

0

アルファベットの順序('BC'と'CB'、'BF'と'FB'、など)を気にしなくてよいならば、以下のように書けます。

sql

1SELECT CONCAT(t1.box, t2.box) 2FROM tbl AS t1 3INNER JOIN tbl AS t2 4WHERE t1.nakami LIKE '%りんご%' AND t2.nakami LIKE '%キウイ%';

http://sqlfiddle.com/#!9/0c1602/5

もっとも、箱の中身は別々のテーブルとして定義した方が良いかも知れません。
「スペース区切り」で複数のデータを1つのカラムに格納すると、
検索の際にインデックスを使用できなかったり、
データの内容によっては正確な結果を得られなかったりするからです。(※)

例えば、以下のような感じです。

sql

1CREATE TABLE box ( 2 name varchar(1) PRIMARY KEY 3); 4 5INSERT INTO box VALUES ('A'), ('B'), ('C'), ('D'), ('E'), ('F'); 6 7CREATE TABLE nakami ( 8 box_name varchar(1) NOT NULL, 9 fruit varchar(32) NOT NULL, 10 11 FOREIGN KEY (box_name) REFERENCES box (name) 12); 13 14INSERT INTO nakami VALUES 15 ('A', 'りんご'), 16 ('A', 'バナナ'), 17 ('B', 'キウイ'), 18 ('B', 'パイナップル'), 19 ('C', 'りんご'), 20 ('D', 'バナナ'), 21 ('D', 'パイナップル'), 22 ('E', 'バナナ'), 23 ('E', 'ライチ'), 24 ('F', 'りんご'), 25 ('F', 'みかん');

りんご が入った箱と キウイ が入った箱の組み合わせを取得するには、以下のような SQL が書けます。

sql

1SELECT CONCAT(b1.name, b2.name) 2FROM box AS b1 3INNER JOIN nakami AS n1 ON b1.name = n1.box_name 4INNER JOIN box AS b2 5INNER JOIN nakami AS n2 ON b2.name = n2.box_name 6WHERE n1.fruit = 'りんご' AND n2.fruit = 'キウイ';

http://sqlfiddle.com/#!9/87da7/5

※ この辺りの話題は、例えば『SQLアンチパターン』(オライリー・ジャパン)の「1章 ジェイウォーク(信号無視)」で詳しく解説してあります。
興味があれば読んでみてください。
https://www.oreilly.co.jp/books/9784873115894/

投稿2017/01/17 05:10

編集2017/01/17 05:11
KiyoshiMotoki

総合スコア4791

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

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

0

こういうことでしょうか?
MySQL でなく、 sqlite3 で行っていますが、 SQL 文は同じだと思います。

sqlite> select * from boxes; A|りんご バナナ B|キウイ パイナップル C|りんご D|バナナ パイナップル E|バナナ ライチ F|りんご みかん sqlite> select * from boxes where nakami like "%りんご%" or nakami like "%キウイ%"; A|りんご バナナ B|キウイ パイナップル C|りんご F|りんご みかん sqlite> select * from (select b1.box, b2.box, b1.nakami || ' ' || b2.nakami as nakami from boxes as b1 cross join boxes as b2 where b1.box < b2.box) where nakami like "%りんご%" and nakami like "%キウイ%"; A|B|りんご バナナ キウイ パイナップル B|C|キウイ パイナップル りんご B|F|キウイ パイナップル りんご みかん

最後の SQL は、 box の組み合わせ (同じ箱を2つ選ぶのは除外) をすべて生成し、
その2つの箱の中味をあわせたものが、りんごとキウイを含んでいるものを取り出しています。

投稿2017/01/16 16:20

katoy

総合スコア22324

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

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

0

  • 指定した条件で
  • 最小限または3つ以下

が相関関係をふくめ何をしたいかわからない

とくに最小限=minをとるとして、最小値が複数個出てきた場合
1個~3個どういう条件で絞り込むのか?
同じ最小値が4個以上だった場合どうするのか?
仕様がみえてきません。

具体的にどういったデータ群から、結果としてどういう値を
抽出したいかを提示されたほうが速いかもしれません

修正版

以下のような感じでやってください

SQL

1create table tbl(box varchar(10),nakami varchar(100)); 2insert into tbl values('A','りんご バナナ'),('B','キウイ パイナップル'),('C','りんご'),('D','バナナ パイナップル'),('E','バナナ ライチ'),('F','りんご みかん'); 3select concat(b1,b2) as box 4from(select box as b1 from tbl where nakami like '%りんご%') as t1 5,(select box as b2 from tbl where nakami like '%キウイ%' ) as t2

本来ならデータの持ち方を工夫してもっと楽で効率的なやり方をします

投稿2017/01/16 12:51

編集2017/01/17 03:37
yambejp

総合スコア114572

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

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

yambejp

2017/01/17 03:37

追記しときました
guest

0

下記の様に、LIMITで取ればよいのではないでしょうか。

SQL

1SELECT * FROM data where 取得したい条件 LIMIT 3;

もう少し、具体的なテーブルの内容や抽出条件などを書かれると、より回答がしやすいと思います。

投稿2017/01/16 12:47

motuo

総合スコア3027

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問