非再帰的無限分類問題。専門家からの指導をお願いします

WBOY
リリース: 2016-06-23 14:17:46
オリジナル
845 人が閲覧しました

この投稿は vbker によって最終編集されました: 2012-09-05 10:19:59

現時点では、データベースのフィールドは次のとおりです。リージョンは列を表し、cid は列 ID、カテゴリは列名です。 、chain は関係ツリー、rank は列の並べ替えです
mysql> select * from mc_category;+-----+----------+--------------+------+| cid | category | chain        | rank |+-----+----------+--------------+------+|   1 | 国内     | 0_1          |    2 ||   2 | 国外     | 0_2          |    1 ||   3 | 华北     | 0_1_3        |    2 ||   4 | 东北     | 0_1_4        |    1 ||   5 | 西部     | 0_1_5        |    3 ||   6 | 河南     | 0_1_3_6      |    1 ||   7 | 郑州     | 0_1_3_6_7    |    2 ||   8 | 巩义     | 0_1_3_6_7_8  |    1 ||   9 | 洛阳     | 0_1_3_6_9    |    1 ||  10 | 偃师     | 0_1_3_6_9_10 |    1 ||  11 | 辽宁     | 0_1_4        |    3 ||  12 | 吉林     | 0_1_4_11_12  |    1 ||  13 | 上街     | 0_1_3_6_7_13 |    2 |+-----+----------+--------------+------+
ログイン後にコピー



select category,chain from mc_category group by chain order by chain;
ログイン後にコピー

を使用すると、正しい親子関係に従ってディレクトリ ツリーを一覧表示できますが、今はまだ次に従って同じレベルの列を並べ替える必要があります。ランク値はmysqlでできるのでしょうか? ============================================ =========================


ディスカッション(解決策)への返信

、私の投稿はすぐに埋もれてしまいました! ! !


MySQL 構文はあまり熟練していないので、通常はすべてのデータを出力し、配列をアセンブルして必要なディレクトリ ツリーをリストします

ありがとう、上の階

mc_category からカテゴリ、チェーンを選択し、チェーン順、ランク順にグループ化します

select category,chain from mc_category group bychain order bychain,rank

これは機能しません。これは、チェーンが同じ場合にのみランクによって並べ替えることができますが、今はチェーンの値が異なるため、並べ替えられていますランクによるものは機能しません。

どうすれば私たちは仲間と呼べるのでしょうか?チェーンも同じですか?


テストを容易にするために、テーブルの作成と挿入のステートメントを投稿することをお勧めします。 。

助けて!


実際、テーブル内のデータを

insert into mc_category (cid,category,chain,rank) values (1, '国内', '01', 2),(2, '国外', '02', 1),(3, '华北', '0103', 2),(4, '东北', '0104', 1),(5, '西部', '0105', 3),(6, '河南', '010306', 1),(7, '郑州', '01030607', 2),(8, '巩义', '0103060708', 1),(9, '洛阳', '01030609', 1),(10, '偃师', '0103060910', 1),(11, '辽宁', '010410', 3),(12, '吉林', '01041112', 1),(13, '上街', '0103060713', 2)
ログイン後にコピー
のようなものに変更すると、すべて一緒に解決されます
2 文字の長さはレベルを表します

写真にアクセスするだけです

、私は写真を許可しないバイドゥを軽蔑します

リンクアウトされています。新しい写真は以下の通りです

尚潔が公儀の前にいるのは、順位が下がっているからです
では、洛陽と燕石が鄭州の前にいる理由は何でしょうか?

チェーンの長さから、鄭州と洛陽の列が同じレベルにあることがわかります。要件に従って、同じレベルの列はランクに従って並べ替える必要があるため、洛陽が前にある必要があります。鄭州。順序を調整した後、ディレクトリ ツリーの親子関係を混乱させることはできません。Yanshi は洛陽のサブ列であるため、Yanshi は洛陽に従う必要があります。したがって、洛陽と燕石は鄭州よりも先にあるはずです。

この投稿の最終編集者は、xuzuning 2012-09-06 10:59:59 です

前にも言いましたが、「尚潔がゴンイーの前にいるのは、順位が高いからです」

それから、順位の降順では、鄭州は洛陽の前にあるはずです

洛陽の順位は1で、鄭州の順位は2なので


別の基準を実装できないでしょうか?もう一度考えてみませんか?

$n = 10;
select category,chain,rank from mc_category order by rpad(left(chain, 2),$n,'0') desc,rpad(left(chain, 4),$n,'0') asc,rpad(left(chain, 6),$n,'0') asc,length(chain)>6,rank desc
ログイン後にコピー
国外	02		1国内	01		2华北	0103		2河南	010306		1郑州	01030607	2上街	0103060713	2巩义	0103060708	1洛阳	01030609	1偃师	0103060910	1东北	0104		1辽宁	010410		3吉林	01041112	1西部	0105		3
ログイン後にコピー


、出てきました、ランクの降順はわかりました、私が言いたいのは、チェーンによる順序、ランクです。この場合、最初にチェーンに基づいてソートが行われ、次に等しいチェーンの値がランクに従ってソートされます。ただし、ここでのチェーンの値は同じではないため、ランクが昇順であるかどうかはわかりません。または降順では機能しません。まずは上記のクエリを勉強してみます、ありがとうございます!
これを実装したい場合は、まずデータをグループ化し、次にグループに従って並べ替える必要があります。上記の各地名は列を表し、チェーンは列の関係チェーンです。

しつこい誤解

質問者の要件は、同じ親カテゴリのサブカテゴリをランク順にソートすることです


これは、mysql だけでは実行できません。分類ツリーを読み取って処理するプログラムを使用する必要があります。

この種の分類木にはキャッシュを使用することをお勧めします

なぜ間違って理解したのでしょうか? 0 类 父親カテゴリー 01030607
鄭州 01030607 2

0103060713 2
恭儀 0103060708 1
父親カテゴリー 010306
河南省 010306 1
鄭州 01 030607 01030609
父親機密 01 国内 01 2
中国北部 0103 2
東北 0104 1
主 主 主主主主主主主主主主主0 0 the postmoier vbker] この問題に対する解決策はありますか?教えていただければ幸いです〜

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート