0

Taxonomyは、組織の構造に関係するすべてのものを保持するという名前のテーブルを持っています。学校の例としてテーブルは次のようになります

id | name | type | parent
1  | 2014 | year | null
2  | igcse| dep  | 1
3  | kg1  | grade| 2
4  | c1   | class| 3

4種類あり、一番上が学年(2014-2015)など。その下の学科、その下の学年 (grade1、2、3 など) の下の複数のクラス。

これを取得する必要があるときは、次のような自己結合クエリを実行します。

SELECT y.name AS year,
       d.name AS dep,
       g.name AS grade,
       c.name AS class,
       e.name AS exam
FROM `taxonomys` e
left JOIN `taxonomys` c on c.id = e.parent
left JOIN `taxonomys` g on g.id = c.parent
left JOIN `taxonomys` d on d.id = g.parent
left JOIN `taxonomys` y on y.id = d.parent
where c.type in ('grade','department','class','year')

私が得る非常に多くのヌルを除いて、それは正常に動作します! クエリの結果の例 mysqlの結果

ご覧のとおり、クラスは年の下のフィールドで正しく表示されます。

まだ最初の行では、年は Class フィールドの下にあります (3 セルをシフト)。

null値がシフトされるたびに。どうすれば修正できますか?

どうもありがとう

編集

What is this table ?

typeAdjacency List Model のバリエーションとして、パス全体を取得しなくても任意の行のレベルを識別できるように、名前付きの追加の列を追加しました。

テーブルは学校の構造を保持します。例

毎年新しい年に、彼らは「2014-2015」という A Year の例を作成し、今年中に学校のさまざまな部門「アメリカの卒業証書、高校、プレイスクールなど」を作成します。 ..

id name        type   parent
1  2014-2015   year   null       
2  highschool  dep.   1
3  grade 10    grade  2
4  grade 11    grade  2
5  class a     class  3 
6  class b     class  3

これらの入力手段

   2014-2015
   |__Highschool
             |__ grade 10
                   |__ class a  
                   |__ class b
             |__ grade 11

別のテーブルが学生をクラスノードにリンクした後、別のテーブルリンクがクラスの投稿などにリンクします。

したがって、このテーブルは基本的に学校の構造を保持します。年、学科、学年は学校のユーザーの組織のためにのみ存在するため、「必要な名前以外のデータはありません」と、すべてを 1 つのテーブルにまとめることにしました。

Why did you build it in this a very very very bad/anti-pattern design ?

それは実際に私にとって非常にうまく機能しています!(私たちはすべての部門、学生、クラスで 4 年間過ごし、ユーザー/クラスにリンクされた 100,000 件を超える投稿、および 10,000 件を超えるユーザーとこれまでのところスムーズに機能しています!)

4

2 に答える 2

1

あなたの出力がどうあるべきかわかりませんし、あなたのクエリがそれを得るためにどのように想定されているのかもわかりませんし、テーブル内のどの情報をどのようにエンコードしているのかわかりませんが、クエリ以下はあなたが望む結果を与え、それはやや冗長であり(つまり、最後の4行)、あなたのデザインは本当に、本当に、本当にアンチパターンです.

/*
rows y.n,d.n,g.n,c.n,e.n
where
    taxonomies(y.i,y.n,'year',y.p)
AND taxonomies(d.i,d.n,'dep',y.i) AND taxonomies(g.i,g.n,'grade',d.p)
AND taxonomies(c.i,c.n,'class',g.i) AND taxonomies(e.i,e.n,'exam',c.i)
*/
SELECT y.name AS year,
       d.name AS dep,
       g.name AS grade,
       c.name AS class,
       e.name AS exam
FROM `taxonomys` y
JOIN `taxonomys` d on y.id = d.parent
JOIN `taxonomys` g on d.id = g.parent
JOIN `taxonomys` c on g.id = c.parent
JOIN `taxonomys` e on c.id = e.parent
WHERE y.type = 'year'
AND d.type = 'dep'
AND g.type = 'grade'
AND c.type = 'class'
AND e.type = 'exam'
于 2014-12-14T09:31:12.997 に答える
0

彼らは左にシフトしており、あなたはleft JOIN. それは手がかりです。only に変更することをお勧めしますjoin。a を実行するleft JOINと、左側のテーブルのすべての行が、右側のテーブルの一致する行と共に取得されます。右側のテーブルに一致する列がない場合、NULL 値が返されます。

場所を移動する列は私の目には新しいものですが (ここではSQLの専門家ではありません)、同じテーブルからすべてのデータを取得しているという事実に関連している可能性があるようですtaxonomys

于 2014-12-14T09:28:07.343 に答える