2

私はデータベースとmysqlに不慣れです。私が直面している問題が何であるかを正確に判断することさえ困難であり、関連するグーグル検索が何であるかを本当に知りません。ですから、これが驚くほど遅れた質問であるなら、私を許してください。私は2つのテーブルtabsとを持っていcatsます。

tabsこのようなものです:

name | order
tab1 | 3
tab2 | 0
tab3 | 1
tab4 | 2

catsこのようなものです:

name | tab_name
cat1 | tab3
cat2 | tab3
cat3 | tab1
cat4 | tab1
cat5 | tab1

私はそれが1対多の関係タブ対猫だと思います。私の質問は、それぞれが関連するすべての猫を含む個別のタブ名のみを返すクエリをどのように構成できるかということです。私はすべての猫と多くの重複したタブで結果を得ることができます。または、個別のタブしか取得できませんが、タブごとに1匹の猫しか取得できません。たぶん、PHPコードで重複するタブをテストする必要がありますか?または、タブをクエリしてから、各タブのすべての猫をクエリしますか?もっと直接的な方法が必要なようです。私は現在このクエリを使用しています:

SELECT t.name AS tab, c.name AS cat FROM tabs t
LEFT JOIN categories c
ON t.name=c.tab_name
ORDER BY t.order;
4

2 に答える 2

3

必要に応じて、MySQL を使用GROUP_CONCAT()して のコンマ区切りリストを生成できます。cat

SELECT
  t.name AS tab,
  GROUP_CONCAT(c.name) AS cats
FROM 
  tabs t 
  LEFT JOIN categories c ON t.name = c.tab_name
GROUP BY tab
ORDER BY t.`order`   /* ORDER is a reserved keyword and has to be quoted as `order` */

これにより、次のような出力が生成されます。

tab      cats
------------------------------
Tab1     Cat1,Cat2,Cat3,Cat4
Tab2     Cat4,Cat3,Cat6,Cat7

でも、

あたりtabに複数の行を生成するクエリは、これを処理するより従来の方法です。tab catアプリケーション コードでは、ペアをループして、 の変更をテストしtabます。上記を使用する場合は、アプリケーション コードで GROUP_CONCAT()分割する必要もあります。,

いずれにせよ、SQL で階層的な結果を行ごとに取得することはできませんtab。行ごとに繰り返す必要があります。これは、結果セットの 2 次元構造の性質です。そのため、アプリケーション側の処理が必要になります。

于 2012-11-30T02:40:48.100 に答える
2

SQL は階層クエリに最適ではありません。ただし、クエリの出力は、アプリケーション内での処理に適しています。

$tabs = array();
while ($row = $stmt->fetch()) {
    $tabs[$row['tab']][] = $row['cat'];
}

個別のカテゴリも必要な場合:

    $tabs[$row['tab']][$row['cat']] = $row['cat'];

タブを最初の次元、カテゴリを 2 番目の次元とする 2 次元配列を生成します。

于 2012-11-30T03:08:22.520 に答える