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

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

ただいまの
回答率

90.49%

  • MySQL

    5990questions

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

  • SQL

    2463questions

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

  • データベース

    715questions

    データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

【MySQL】 複雑な検索条件のデータ取得について

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 715

maru--ko

score 22

まず、やらないであろう、無茶苦茶なケースですが
例えば一つのViewに記事とつぶやきを表示させ、
かつ、ページネーションも実装し、日時でソートしなければいけないとします。
その状況で、以下のテーブルから以下の取得したいデータを取ってこれるSQL文など
ありますでしょうか?

Databseは MySQL Innodbです。

テーブル
User Table:
-----------------
| id | name | 
-----------------
|  1 | hoge |
-----------------
|  2 | fuga |
-----------------

Group Table:
-----------------
| id | name | 
-----------------
|  1 | hoge |
-----------------

Tweet Table:
------------------------------------------------------------------------
| id | tweet | group_id | user_id |      created_at     |
------------------------------------------------------------------------
|  1 |  hoge |        1 |       1 | 2015-10-10 10:10:00 |
------------------------------------------------------------------------
|  2 |  fuga |        1 |       2 | 2015-10-10 10:10:01 |
------------------------------------------------------------------------

Post Table:
-------------------------------------------------------------------------------------------
| id | title | description | group_id | user_id |     created_at      |
-------------------------------------------------------------------------------------------
|  1 |  hoge |  何かはいる  |       1 |       1 | 2015-10-10 10:10:02 |
-------------------------------------------------------------------------------------------

取得したいデータ
--------------------------------------------------------------------------------------------------------------------------
| group_id | tweet_id | post_id | title | description | tweet | user_id |      created_at     |
--------------------------------------------------------------------------------------------------------------------------
|  1       |        1 |    null |  null |       null  |  hoge |       1 | 2015-10-10 10:10:02 |
--------------------------------------------------------------------------------------------------------------------------
|  1       |        1 |    null |  null |       null  |  fuga |       2 | 2015-10-10 10:10:01 |
--------------------------------------------------------------------------------------------------------------------------
|  1       |     null |       1 |  hoge |     何か入る |  null |       1 | 2015-10-10 10:00:00 |
--------------------------------------------------------------------------------------------------------------------------





(
    SELECT  
        group_id,
        id AS post_id, 
        NULL AS tweet_id,
        title,
        description,
        NULL AS tweet,
        user_id,
        created_at
    FROM posts
    WHERE group_id = 1
    ORDER BY created_at DESC;
) 
UNION ALL 
(
    SELECT
        group_id,
        NULL AS post_id, 
        id AS tweet_id,
        NULL AS title,
        NULL AS description,
        tweet,
        user_id,
        created_at
    FROM tweets
    WHERE group_id = 1
    ORDER BY created_at DESC;
)
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

0

そうですね。意図としてはおおむねそういうことです。

仕様がよくわかりませんが、「記事とつぶやき」はどのようにソートするのでしょうか。「記事のあとにつぶやき」なら今のままでいいならいいですけど、もしも「結合後に全体をソートしたい」のなら以下のようなイメージです。

動作確認していないので間違いがあるかもしれません。もしかしたら、「))」のあとに仮想のテーブル名が必要かもしれません。もしそうなら、どうせ使わない名前ですが「AS T」とかテキトウにつければ動くはずです。


SELECT * FROM ((
    SELECT  
        group_id,
        id AS post_id, 
        NULL AS tweet_id,
        title,
        description,
        NULL AS tweet,
        user_id,
        created_at
    FROM posts
    WHERE group_id = 1
)
UNION ALL
(
    SELECT
        group_id,
        NULL AS post_id, 
        id AS tweet_id,
        NULL AS title,
        NULL AS description,
        tweet,
        user_id,
        created_at
    FROM tweets
    WHERE group_id = 1
))
ORDER BY created_at DESC;

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

checkベストアンサー

-1

>以下のテーブルから以下の取得したいデータを取ってこれるSQL文などありますでしょうか? 
え?「ありますか」が質問ですか?とりあえず、あるかないかが知りたいのなら「ありますよ」が答えになります。

また「取得したいデータ 」を得るためには、それぞれのテーブルを検索するSQLを2つ書いてUNIONで結合してcreated_atでソートすればそれで済みます。その際、双方のカラム数・カラム名をあわせ、自テーブルに存在しないカラムは固定でnullを設定する部分だけ気をつければ何も難しくはないでしょう。

「UNIONって何?」ということなら以下を読んでください。
MySQL :: MySQL 5.0 Reference Manual :: 13.2.8.3 UNION Syntax


あるいは、初心者マークがついていませんが本当は初心者で「そもそもSELECT文の書き方が全くわからないから、自分の代わりに1から100まですべて書いて」ということなのでしょうか…?

何が分からないのかイマイチわかりません…。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/06/04 21:08

    すみません、つけ忘れてしまいましたが・・・初心者です。
    ご教授ありがとうございます。
    つまり、こんな感じでやれば行けるということでしょうか

    ```lang-sql
    (
    SELECT
    group_id,
    id AS post_id,
    NULL AS tweet_id,
    title,
    description,
    NULL AS tweet,
    user_id,
    created_at
    FROM posts
    WHERE group_id = 1
    )
    UNION ALL
    (
    group_id,
    NULL AS post_id,
    id AS tweet_id,
    NULL AS title,
    NULL AS description,
    tweet,
    user_id,
    created_at
    )
    WHERE
    group_id = 1
    ORDER BY
    created DESC;
    ```

    キャンセル

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

  • ただいまの回答率 90.49%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • MySQL

    5990questions

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

  • SQL

    2463questions

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

  • データベース

    715questions

    データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます