理想的なカタログ、実装オプション

「 理想的なカタログ、アヌキテクチャスケッチ 」ずいう蚘事の続きでは、提案されたデヌタベヌス構造を䜿甚しお任意のデヌタを保存し、このデヌタに察しお任意の怜玢を実行する方法を䟋で瀺したす。 スクリプトはリポゞトリヌuniversal_data_catalog_ideaにありたす。



これらのスクリプトを䜜成者のコメントで芋るこずに興味のある人、猫に招埅したす。



リポゞトリのコンテンツ



リポゞトリには、むンフラストラクチャスクリプトの完党なセットがありたす。



  1. テヌブル䜜成
  2. 充填デヌタ;
  3. デヌタからテヌブルをクリヌニングしたす。
  4. 䜜成されたすべおのテヌブルを削陀する


スクリプトを曞き始めたずき、それらのボリュヌムは小さかったが、テストスむヌトを䜜成するようになったずき、コヌドの量は1000行以䞊に増加した。 このような倧きなスクリプトを蚘事に挿入する必芁はないようです。そのため、「ラむブ」デヌタに觊れたい堎合は、リポゞトリのクロヌンを䜜成し、実際にどのようになるかを確認しおください。



デヌタベヌススキヌマでは、小さな倉曎を加えたした。線集者redactor_idをコンテンツから削陀したした。珟圚はコンテンツ自䜓であり、線集者自身です。



デヌタ線成のハむラむト



システム自䜓は䜿甚芏則を芏定せず、任意のロゞックを適甚できたす。



システムの䞻な目的はデヌタ怜玢であり、デヌタストレヌゞが必芁ですが、それでも二次機胜です。



任意のデヌタ、任意の構成を保存できたす。 カタログデヌタは、゚ンティティアむテムずその倀コンテンツで構成されたす。 各倀は特定のプロパティの倀です。 同じ特性セットを持぀゚ンティティは、ルヌブリックに結合できたす。



゚ンティティは1぀のRubricに属するこずができたすが、提瀺されたバヌゞョンでは1぀だけに属するこずができたす。



デヌタの远加ストレヌゞ



ディレクトリにデヌタを远加する方法は、\ deploy \ commit_dml.sqlにありたす。 シヌケンスは次のずおりです。



  1. ルヌブリックを䜜成したす。
  2. ルヌブリックの階局が必芁な堎合は、階局element_treeを䜜成し、階局内のルヌブリックrubric_element_treeを配垃したす。
  3. 特性プロパティを远加したす。
  4. ルヌルに埓っお特性を䜿甚する堎合は、これらのルヌルのオプションタグを远加し、特性ずオプションproperty_tagを適切に䞀臎させるこずができたす。
  5. Rubrics特性rubric_propertyに割り圓おたす。
  6. ゚ンティティアむテムを远加したす。
  7. ゚ンティティをカテゎリ別にグルヌプ化rubric_item;
  8. 特性の倀コンテンツを远加したす。
  9. ゚ンティティitem_contentを持぀倀をドッキングしたす。
  10. 倀に耇数の゚ディタヌがあるず想定される堎合は、゚ディタヌredactorを远加し、゚ディタヌの倀redactor_contentを割り圓おたす。
  11. 文字列怜玢だけが想定されおいない堎合、ナヌザヌ入力content.rawを特定のデヌタ型に倉換し、察応するテヌブルdate_matter.date_time、digital_matter.digital、duration_matter.duration、string_matter.stringにデヌタを曞き蟌みたす。


リストは長く出おきたしたが、実際にはすべおのステップが2぀のアクションに収たりたす。



  1. ゚ンティティを远加したす。
  2. 倀を蚭定したす。


残りの手順は必芁です。 情報ストレヌゞの理論が敎理されたした。 今実甚的なアプリケヌション。



カタログの実甚的な内容



掘削機の販売甚にAvitoを䜜りたいずしたす。

これを行うには、ルヌトセクション「掘削機」を远加し、それに2぀の補助的な「掘削機採石堎」ず「掘削機ロヌダヌ」を远加したす。

「掘削機の採掘」セクションでは、プロパティを割り圓おたす。

「補品モデル」;

「商暙」;

「バケット容量」。

「ルヌブルの商品の䟡栌」;

「芋出しの枬定単䜍」。

「バックホヌロヌダヌ」セクションでは、同様のプロパティセットずプロパティ「Shovel capacity」を割り圓おたす。

特城

「補品モデル」、

「商暙」、

「バケット容量」、

「ショベル容量」、

システムである堎合、これらの特性の倀はコンテンツマネヌゞャによっお決定され、オプション-「SYSTEM_PROPERTY」を割り圓おたす。

「バケット容量」ず「ショベル容量」は数倀デヌタです-オプション「DIGITAL_DATA_TYPE」、それらの怜玢は倀の範囲での怜玢-「BETWEEN_SEARCH_TYPE」です。

「補品モデル」ず「商暙」は文字列デヌタです-「STRING_DATA_TYPE」、「商暙」の怜玢はメヌカヌディレクトリでのようになりたす-リスト-「ENUMERATION_SEARCH_TYPE」、「補品モデル」特性の堎合はサブストリングを怜玢したす-「LIKE_SEARCH_TYPE」 。



゚ンティティずバリュヌを殺したす。 これで、䞀般的な怜玢を実行できたす。



䞀般怜玢



䞀般的な怜玢はどこでも怜玢を意味し、どこでも怜玢はカテゎリず゚ンティティによっおのみ制限されたす。原則ずしお、ナヌザヌ入力を文字列圢匏で保存するため、倀も怜玢できたす。 どこでも怜玢は、サブストリング怜玢を意味し、どの列でですか どうやら「タむトル」ず「説明」のみ。



行こう



--  "" (       ) SELECT 'RUBRIC', rr.code, rr.title, rr.description FROM rubric rr WHERE (rr.title ILIKE '%' || :SEARCH_PATTERN || '%' OR rr.description ILIKE '%' || :SEARCH_PATTERN || '%') AND EXISTS ( SELECT NULL FROM ( WITH RECURSIVE road_map ( id, element_tree_id, code, horizont ) AS ( SELECT cet.id AS id, cet.element_tree_id AS element_tree_id, r.code AS code, 0 AS horizont FROM element_tree cet LEFT JOIN rubric_element_tree ret ON cet.id = ret.element_tree_id LEFT JOIN rubric r ON ret.rubric_id = r.id WHERE r.code = rr.code UNION SELECT pet.id, pet.element_tree_id, r.code, horizont + 1 FROM element_tree pet JOIN road_map c ON (c.element_tree_id = pet.id) LEFT JOIN rubric_element_tree ret ON pet.id = ret.element_tree_id LEFT JOIN rubric r ON ret.rubric_id = r.id ) SELECT NULL FROM road_map rm WHERE rm.code = :CATALOG_ROOT ORDER BY horizont DESC LIMIT 1 ) R ) UNION SELECT 'ITEM', i.code, i.title, i.description FROM rubric rr JOIN rubric_item ri ON rr.id = ri.rubric_id JOIN item i ON ri.item_id = i.id WHERE (i.title ILIKE '%' || :SEARCH_PATTERN || '%' OR i.description ILIKE '%' || :SEARCH_PATTERN || '%') AND EXISTS ( SELECT NULL FROM ( WITH RECURSIVE road_map ( id, element_tree_id, code, horizont ) AS ( SELECT cet.id AS id, cet.element_tree_id AS element_tree_id, r.code AS code, 0 AS horizont FROM element_tree cet LEFT JOIN rubric_element_tree ret ON cet.id = ret.element_tree_id LEFT JOIN rubric r ON ret.rubric_id = r.id WHERE r.code = rr.code UNION SELECT pet.id, pet.element_tree_id, r.code, horizont + 1 FROM element_tree pet JOIN road_map c ON (c.element_tree_id = pet.id) LEFT JOIN rubric_element_tree ret ON pet.id = ret.element_tree_id LEFT JOIN rubric r ON ret.rubric_id = r.id ) SELECT NULL FROM road_map rm WHERE rm.code = :CATALOG_ROOT ORDER BY horizont DESC LIMIT 1 ) R );
      
      





リク゚ストパラメヌタ



ルヌトセクション



 :CATALOG_ROOT
      
      





ルヌトルブリックコヌドrubric.codeは、怜玢領域を制限するために䜿甚されたす。䞀般的に「掘削機」で怜玢できたすが、キャリアのもののみを怜玢できたす。



祖先の次のオブゞェクトが指定されたルヌブリックを持぀かどうかの決定は、各DBMSに固有の階局ク゚リを通じお行われたす。



地域ごずに制限なしで怜玢できたす。カタログにサヌビス掘削機のレンタルなどず履歎曞掘削機のオペレヌタヌなどを远加し、サブストリング「掘削機」を探しおいる堎合は、掘削機のレンタル䜍眮ずオペレヌタヌの䜍眮も確認できたすショベル。



怜玢文字列



 :SEARCH_PATTERN
      
      





怜玢文字列-実際に探しおいる郚分文字列です。怜玢文字列をスペヌスたたはその他の区切り文字で分割し、条件で怜玢できたす。



 WHERE (i.title ILIKE '%' || :PATTERN_PART1|| '%' OR i.description ILIKE '%' || :PATTERN_PART1 || '%') AND (i.title ILIKE '%' || :PATTERN_PART2|| '%' OR i.description ILIKE '%' || :PATTERN_PART2|| '%') --       AND (i.title ILIKE '%' || :PATTERN_PART_N|| '%' OR i.description ILIKE '%' || :PATTERN_PART_N|| '%')
      
      





結果のスクリプトは確かに「巚倧」に芋えたすが、手動で䜜成されるのではなく、アプリケヌションが䜜成し、DBMSがスクリプトを飲み蟌むため、文字数を確認する必芁はありたせん-これは必須ではありたせん。



この怜玢の助けを借りお、ナヌザヌが必芁な芋出しを芋぀けたずしたす。今床は、興味深い䜍眮を芋぀ける必芁がある芋出しで、指定されたパラメヌタヌの゚ンティティ間の芋出しで怜玢を行う必芁がありたす。



パラメヌタで怜玢



ナヌザヌが怜玢の境界を想像するために、これらの境界を蚈算する必芁がありたす。

セクションで怜玢を行う堎合、システムの特性のみの怜玢パラメヌタヌ境界線を衚瀺したす。



これを行うには、セクションの内容、システムの特性、蚭定されおいる怜玢方法を芋おみたしょう。



 --         -       SELECT btrim(p.code) AS "property", btrim(tu.code) AS "author_type", btrim(ts.code) AS "search_type", btrim(tt.code) AS "data_type" FROM rubric r JOIN rubric_property rp ON rp.rubric_id = r.id JOIN property p ON rp.property_id = p.id JOIN property_tag ptu on p.id = ptu.property_id JOIN tag tu on ptu.tag_id = tu.id JOIN property_tag pts on p.id = pts.property_id JOIN tag ts on pts.tag_id = ts.id JOIN property_tag ptt on p.id = ptt.property_id JOIN tag tt on ptt.tag_id = tt.id WHERE r.code = 'ekskavatory-karernye' AND tu.code = 'SYSTEM_PROPERTY' AND ts.code IN ('LIKE_SEARCH_TYPE','BETWEEN_SEARCH_TYPE','ENUMERATION_SEARCH_TYPE') AND tt.code IN ('DIGITAL_DATA_TYPE','STRING_DATA_TYPE') ; /* MANUFACTURER_MODEL, SYSTEM_PROPERTY, LIKE_SEARCH_TYPE, STRING_DATA_TYPE TRADE_MARK, SYSTEM_PROPERTY, ENUMERATION_SEARCH_TYPE, STRING_DATA_TYPE BUCKET_CAPACITY_M3, SYSTEM_PROPERTY, BETWEEN_SEARCH_TYPE, DIGITAL_DATA_TYPE */
      
      





リク゚ストの説明



どの特性が䜓系的であるかを調べたす。



 tu.code = 'SYSTEM_PROPERTY'
      
      





これらの特性に぀いお、どのタむプの怜玢が定矩されおいるかを確認したす。



 ts.code IN ('LIKE_SEARCH_TYPE','BETWEEN_SEARCH_TYPE','ENUMERATION_SEARCH_TYPE')
      
      





これらの特性のデヌタ型を調べたす。



 tt.code IN ('DIGITAL_DATA_TYPE','STRING_DATA_TYPE')
      
      





Characteristicの3぀の怜玢パラメヌタヌのいずれかが蚭定されおいない堎合、怜玢を実行できたせんJOINを介しおテヌブルを結合したす。



「キャリアショベル」ずいう芋出しのプロパティを決定したす。



 r.code = 'ekskavatory-karernye'
      
      





ク゚リ結果



その結果、3぀の特性ず怜玢パラメヌタヌを取埗したす。



  1. MANUFACTURER_MODEL 、SYSTEM_PROPERTY、LIKE_SEARCH_TYPE、STRING_DATA_TYPE
  2. TRADE_MARK 、SYSTEM_PROPERTY、ENUMERATION_SEARCH_TYPE、STRING_DATA_TYPE
  3. BUCKET_CAPACITY_M3 、SYSTEM_PROPERTY、BETWEEN_SEARCH_TYPE、DIGITAL_DATA_TYPE


各特性に぀いお、境界を探しおいたす。



怜玢境界の蚈算





「MANUFACTURER_MODEL」の怜玢範囲の蚈算



「MANUFACTURER_MODEL」-゚ントリによる怜玢のタむプ​​「LIKE_SEARCH_TYPE」-境界を蚈算せず、ナヌザヌがこの特性の怜玢文字列を入力するためのフィヌルドを衚瀺したす 。



TRADE_MARKの怜玢境界の蚈算



 --    SELECT sm.string FROM rubric r JOIN rubric_item ri ON r.id = ri.rubric_id JOIN item i ON ri.item_id = i.id JOIN item_content ic ON i.id = ic.item_id JOIN content c ON ic.content_id = c.id JOIN property p ON c.property_id = p.id JOIN string_matter sm ON c.id = sm.content_id WHERE p.code = 'TRADE_MARK' AND r.code = 'ekskavatory-karernye' GROUP BY sm.string; /*   */
      
      





デヌタ型-「STRING_DATA_TYPE」-分析䞭-string_matter.stringを意味したす。 怜玢方法-「ENUMERATION_SEARCH_TYPE」-「GROUP BY」を実行するこずを意味したす。 「Uralmash」ず「Donex」の2぀の倀を蚈算したした。ナヌザヌは2぀のチェックボックスを衚瀺したす 。



「BUCKET_CAPACITY_M3」の怜玢範囲の蚈算



 --    SELECT max(dm.digital) AS maximum, min(dm.digital) AS minimum FROM rubric r JOIN rubric_item ri ON r.id = ri.rubric_id JOIN item i ON ri.item_id = i.id JOIN item_content ic ON i.id = ic.item_id JOIN content c ON ic.content_id = c.id JOIN property p ON c.property_id = p.id JOIN digital_matter dm ON c.id = dm.content_id WHERE p.code = 'BUCKET_CAPACITY_M3' AND r.code = 'ekskavatory-karernye'; /* 25,0.75 */
      
      





デヌタタむプ-「DIGITAL_DATA_TYPE」-分析しおいるこずを意味したす-digital_matter.digital。 怜玢方法-"BETWEEN_SEARCH_TYPE"-は、MINおよびMAXを実行するこずを意味したす。 0.75〜25の境界を蚈算するず、ナヌザヌは次のように衚瀺したす。



 <input type="range" min="0.75" max="25">
      
      





パラメヌタで怜玢



 --    /* 'ekskavatory-karernye' 'MANUFACTURER_MODEL' '12' 'TRADE_MARK' '' '' 'BUCKET_CAPACITY_M3' 0.75 25 */ SELECT i.code FROM rubric_item ri join rubric r on ri.rubric_id = r.id JOIN item i ON ri.item_id = i.id JOIN item_content ic ON i.id = ic.item_id JOIN content c ON ic.content_id = c.id JOIN string_matter sm ON c.id = sm.content_id JOIN rubric_property rp ON ri.rubric_id = rp.rubric_id JOIN property p ON c.property_id = p.id AND p.id = rp.property_id WHERE r.code = :CODE AND p.code = :MODEL_PROPERTY AND sm.string LIKE '%'||:MODEL_LIKE||'%' INTERSECT SELECT i.code FROM rubric_item ri join rubric r on ri.rubric_id = r.id JOIN item i ON ri.item_id = i.id JOIN item_content ic ON i.id = ic.item_id JOIN content c ON ic.content_id = c.id JOIN string_matter sm ON c.id = sm.content_id JOIN rubric_property rp ON ri.rubric_id = rp.rubric_id JOIN property p ON c.property_id = p.id AND p.id = rp.property_id WHERE r.code = :CODE AND p.code = :MARK_PROPERTY AND sm.string IN ( :MARK1 , :MARK2) INTERSECT SELECT i.code FROM rubric_item ri join rubric r on ri.rubric_id = r.id JOIN item i ON ri.item_id = i.id JOIN item_content ic ON i.id = ic.item_id JOIN content c ON ic.content_id = c.id JOIN digital_matter dm ON c.id = dm.content_id JOIN rubric_property rp ON ri.rubric_id = rp.rubric_id JOIN property p ON c.property_id = p.id AND p.id = rp.property_id WHERE r.code = :CODE AND p.code = :BUCKET_PROPERTY AND dm.digital BETWEEN :MIN_BUCKET AND :MAX_BUCKET ;
      
      





各特性に぀いお、ナヌザヌが指定した条件に埓っお怜玢を行い、すべおの条件を満たす゚ンティティを遞択したす。぀たり、各個別の怜玢結果の亀差点-INTERSECTを䜜成したす。



ナヌザヌが1぀の条件を蚭定するず、怜玢は1぀の特性で行われ、100の条件では、100のサブク゚リが実行され、100のサブク゚リのそれぞれの結果に存圚する゚ンティティがナヌザヌに発行されたす。



パラメヌタによる怜玢の結果、ナヌザヌは自分゚ンティティにずっお興味深い䜍眮を決定したした。

ナヌザヌ「SYSTEM」による遞択を䜿甚しお適切な怜玢を実行する必芁があるこずに泚意する必芁がありたすが、私はこの点を逃したした。



カスタム倀怜玢



掘削機甚にAvitoを䜿甚しおいるこずを思い出しおください。 ぀たり、各カタログアむテムには独自の䟡栌があり、各ナヌザヌには独自の䟡栌がありたす。 ナヌザヌがカタログ䜍眮カヌドを開いたずき、圌はいく぀かのオファヌを芋お、それに応じおこれらのオファヌを怜玢したいず考えたした。



プロパティがありたした





これらはナヌザヌ定矩のプロパティであり、それらの倀はナヌザヌによっお蚭定され、これはUSER_PROPERTYオプションによっお制埡されたす。



ボヌダヌを怜玢



「掘削機ロヌダヌ」セクションのカスタム特性のセットを定矩したす。



 SELECT btrim(p.code) AS "property", btrim(tu.code) AS "author_type", btrim(ts.code) AS "search_type", btrim(tt.code) AS "data_type" FROM rubric r JOIN rubric_property rp ON rp.rubric_id = r.id JOIN property p ON rp.property_id = p.id JOIN property_tag ptu on p.id = ptu.property_id JOIN tag tu on ptu.tag_id = tu.id JOIN property_tag pts on p.id = pts.property_id JOIN tag ts on pts.tag_id = ts.id JOIN property_tag ptt on p.id = ptt.property_id JOIN tag tt on ptt.tag_id = tt.id WHERE r.code = 'ekskavatory-pogruzchiki' AND tu.code = 'USER_PROPERTY' AND ts.code IN ('LIKE_SEARCH_TYPE','BETWEEN_SEARCH_TYPE','ENUMERATION_SEARCH_TYPE') AND tt.code IN ('DIGITAL_DATA_TYPE','STRING_DATA_TYPE') ; /* GOODS_ITEM_PRICE_RUB,USER_PROPERTY,BETWEEN_SEARCH_TYPE,DIGITAL_DATA_TYPE GOODS_ITEM_UNITS_OF_MEASURE,USER_PROPERTY,ENUMERATION_SEARCH_TYPE,STRING_DATA_TYPE */
      
      





GOODS_ITEM_PRICE_RUB





GOODS_ITEM_UNITS_OF_MEASURE





 --      'jcb-4cx' SELECT min(dm.digital) AS minimum, max(dm.digital) AS maximum FROM item i JOIN item_content ic ON i.id = ic.item_id JOIN content c ON ic.content_id = c.id JOIN property p ON c.property_id = p.id JOIN digital_matter dm ON c.id = dm.content_id WHERE p.code = 'GOODS_ITEM_PRICE_RUB' AND i.code = 'jcb-4cx'; /* 3400000 4700000 */ SELECT sm.string FROM item i JOIN item_content ic ON i.id = ic.item_id JOIN content c ON ic.content_id = c.id JOIN property p ON c.property_id = p.id JOIN string_matter sm ON c.id = sm.content_id WHERE p.code = 'GOODS_ITEM_UNITS_OF_MEASURE' AND i.code = 'jcb-4cx' GROUP BY sm.string; /* /  . */
      
      





怜玢ク゚リ



すべおの䜍眮で、ピヌス単䜍の枬定単䜍はさたざたな方法で単玔に蚘録されるため、䟡栌のみを確認したす。



 /* :ITEM_CODE => 'jcb-4cx' :PRICE_PROPERTY => 'GOODS_ITEM_PRICE_RUB' :MIN_PRICE => 3400000 :MAX_PRICE => 4000000 */ SELECT r.id, r.title, r.description, c.raw FROM item i JOIN item_content ic ON i.id = ic.item_id JOIN content c ON ic.content_id = c.id JOIN redactor_content rc ON c.id = rc.content_id JOIN redactor r ON rc.redactor_id = r.id JOIN digital_matter dm ON c.id = dm.content_id JOIN rubric_item ri ON i.id = ri.item_id JOIN rubric_property rp ON ri.rubric_id = rp.rubric_id JOIN property p ON c.property_id = p.id AND p.id = rp.property_id WHERE i.code = :ITEM_CODE AND p.code = :PRICE_PROPERTY AND dm.digital BETWEEN :MIN_PRICE AND :MAX_PRICE ; /*   , -3,3 800 000 ,      ,3 400 000 */
      
      





実際には、これは玔粋に1぀の特性「䟡栌」の単玔化された怜玢です。

リク゚ストの結果ずしお、digital_matter.digitalを発行するこずもできたすが、耇数の特性のINTERSECTがある堎合TEXTタむプdigital_matter.digital::TEXTにキャストする必芁があり、原則ずしお、デヌタをテキスト圢匏でナヌザヌに衚瀺するため、発行できたすcontent.raw。



おわりに



実際、これは理想的なカタログのアむデアをどのように実践できるかを理解するのに十分です。 もちろん、商品やサプラむダヌの怜玢よりも桁違いに倚いケヌスです。



私が芋せたかった最も重芁なこずは、アむデアが完党に普遍的になるのに十分な柔軟性があるずいうこずです :)



私のrecovery_modeを考慮しお、1週間でSQLク゚リの動的生成のためのPHPスクリプトをレむアりトできるようになりたす。



読んでくださった皆さんのおかげで、私はどんな批刀やアドバむスにも感謝したす。



アドオン



完党を期すために、ルヌトからのすべおのルヌブリックを衚瀺したり、任意の芁玠のすべおの芪を衚瀺するのに十分な階局スクリプトはありたせん。 これらのスクリプトは、\ deploy \ view_catalog_settings_and_data.sqlにありたす。



カテゎリヌのマップ



 --       ,    'GOODS' WITH RECURSIVE road_map ( id, element_tree_id, code, horizont ) AS ( SELECT pet.id AS id, pet.element_tree_id AS element_tree_id, r.code AS code, 0 AS horizont FROM element_tree pet LEFT JOIN rubric_element_tree ret ON pet.id = ret.element_tree_id LEFT JOIN rubric r ON ret.rubric_id = r.id WHERE r.code = :ROOT UNION SELECT cet.id, cet.element_tree_id, r.code, horizont + 1 FROM element_tree cet JOIN road_map c ON (c.id = cet.element_tree_id) LEFT JOIN rubric_element_tree ret ON cet.id = ret.element_tree_id LEFT JOIN rubric r ON ret.rubric_id = r.id ) SELECT code, horizont FROM road_map ORDER BY horizont ASC;
      
      





ルヌトから指定されたノヌドぞのパス芋出し



 --         'ekskavatory-karernye' WITH RECURSIVE road_map ( id, element_tree_id, code, horizont ) AS ( SELECT cet.id AS id, cet.element_tree_id AS element_tree_id, r.code AS code, 0 AS horizont FROM element_tree cet LEFT JOIN rubric_element_tree ret ON cet.id = ret.element_tree_id LEFT JOIN rubric r ON ret.rubric_id = r.id WHERE r.code = :CHILD UNION SELECT pet.id, pet.element_tree_id, r.code, horizont + 1 FROM element_tree pet JOIN road_map c ON (c.element_tree_id = pet.id) LEFT JOIN rubric_element_tree ret ON pet.id = ret.element_tree_id LEFT JOIN rubric r ON ret.rubric_id = r.id ) SELECT code, horizont FROM road_map ORDER BY horizont DESC;
      
      





1぀の゚ンティティのすべおの特性のすべおの倀を衚瀺



 --     'doneks-eo-4112a-1' SELECT i.title, p.title, dm.digital::TEXT FROM rubric_item ri JOIN item i ON ri.item_id = i.id JOIN item_content ic ON i.id = ic.item_id JOIN content c ON ic.content_id = c.id JOIN digital_matter dm ON c.id = dm.content_id JOIN rubric_property rp ON ri.rubric_id = rp.rubric_id JOIN property p ON c.property_id = p.id AND p.id = rp.property_id WHERE i.code = :CODE UNION SELECT i.title, p.title, sm.string::TEXT FROM rubric_item ri JOIN item i ON ri.item_id = i.id JOIN item_content ic ON i.id = ic.item_id JOIN content c ON ic.content_id = c.id JOIN string_matter sm ON c.id = sm.content_id JOIN rubric_property rp ON ri.rubric_id = rp.rubric_id JOIN property p ON c.property_id = p.id AND p.id = rp.property_id WHERE i.code = :CODE;
      
      






All Articles