PostgreSQL แƒแƒœแƒขแƒ˜แƒžแƒแƒขแƒ”แƒ แƒœแƒ”แƒ‘แƒ˜: "แƒฃแƒกแƒแƒกแƒ แƒฃแƒšแƒแƒ‘แƒ แƒแƒ  แƒแƒ แƒ˜แƒก แƒ–แƒฆแƒ•แƒแƒ แƒ˜!" แƒแƒœ แƒชแƒแƒขแƒ แƒ แƒแƒ› แƒ แƒ”แƒ™แƒฃแƒ แƒกแƒ˜แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฎแƒ”แƒ‘

แƒ แƒ”แƒ™แƒฃแƒ แƒกแƒ˜แƒ - แƒซแƒแƒšแƒ˜แƒแƒœ แƒซแƒšแƒ˜แƒ”แƒ แƒ˜ แƒ“แƒ แƒ›แƒแƒกแƒแƒฎแƒ”แƒ แƒฎแƒ”แƒ‘แƒ”แƒšแƒ˜ แƒ›แƒ”แƒฅแƒแƒœแƒ˜แƒ–แƒ›แƒ˜, แƒ—แƒฃ แƒ˜แƒ’แƒ˜แƒ•แƒ” โ€žแƒกแƒ˜แƒฆแƒ แƒ›แƒ˜แƒกแƒ”แƒฃแƒšแƒ˜โ€œ แƒ›แƒแƒฅแƒ›แƒ”แƒ“แƒ”แƒ‘แƒ”แƒ‘แƒ˜ แƒจแƒ”แƒกแƒ แƒฃแƒšแƒ“แƒ”แƒ‘แƒ แƒ“แƒแƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ”แƒ‘แƒฃแƒš แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ–แƒ”. แƒ›แƒแƒ’แƒ แƒแƒ› แƒฃแƒ™แƒแƒœแƒขแƒ แƒแƒšแƒ แƒ แƒ”แƒ™แƒฃแƒ แƒกแƒ˜ แƒแƒ แƒ˜แƒก แƒ‘แƒแƒ แƒแƒขแƒ”แƒ‘แƒ, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒ’แƒแƒ›แƒแƒ˜แƒฌแƒ•แƒ˜แƒแƒก แƒแƒ แƒ˜แƒ•แƒ” แƒ’แƒแƒฃแƒ—แƒแƒ•แƒ”แƒ‘แƒ”แƒšแƒ˜ แƒแƒฆแƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒ แƒžแƒ แƒแƒชแƒ”แƒกแƒ˜, แƒแƒœ (แƒ แƒแƒช แƒฃแƒคแƒ แƒ แƒฎแƒจแƒ˜แƒ แƒแƒ“ แƒฎแƒ“แƒ”แƒ‘แƒ). แƒงแƒ•แƒ”แƒšแƒ แƒฎแƒ”แƒšแƒ›แƒ˜แƒกแƒแƒฌแƒ•แƒ“แƒแƒ›แƒ˜ แƒ›แƒ”แƒฎแƒกแƒ˜แƒ”แƒ แƒ”แƒ‘แƒ˜แƒก "แƒญแƒแƒ›แƒ"..

PostgreSQL แƒแƒœแƒขแƒ˜แƒžแƒแƒขแƒ”แƒ แƒœแƒ”แƒ‘แƒ˜: "แƒฃแƒกแƒแƒกแƒ แƒฃแƒšแƒแƒ‘แƒ แƒแƒ  แƒแƒ แƒ˜แƒก แƒ–แƒฆแƒ•แƒแƒ แƒ˜!" แƒแƒœ แƒชแƒแƒขแƒ แƒ แƒแƒ› แƒ แƒ”แƒ™แƒฃแƒ แƒกแƒ˜แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฎแƒ”แƒ‘
DBMS แƒแƒ› แƒ›แƒฎแƒ แƒ˜แƒ• แƒ›แƒฃแƒจแƒแƒแƒ‘แƒก แƒ˜แƒ›แƒแƒ•แƒ” แƒžแƒ แƒ˜แƒœแƒชแƒ˜แƒžแƒ”แƒ‘แƒ–แƒ” - "แƒ›แƒ˜แƒ—แƒฎแƒ แƒ”แƒก, แƒแƒ›แƒแƒ—แƒฎแƒแƒ แƒ”แƒ, แƒแƒกแƒ” แƒ•แƒ—แƒฎแƒ แƒ˜แƒ—แƒฅแƒ•แƒ”แƒœแƒก แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒแƒก แƒจแƒ”แƒฃแƒซแƒšแƒ˜แƒ แƒแƒ แƒ แƒ›แƒฎแƒแƒšแƒแƒ“ แƒจแƒ”แƒแƒœแƒ”แƒšแƒแƒก แƒ›แƒ”แƒ–แƒแƒ‘แƒ”แƒšแƒ˜ แƒžแƒ แƒแƒชแƒ”แƒกแƒ”แƒ‘แƒ˜, แƒ›แƒฃแƒ“แƒ›แƒ˜แƒ•แƒแƒ“ แƒแƒ˜แƒ—แƒ•แƒ˜แƒกแƒแƒก แƒžแƒ แƒแƒชแƒ”แƒกแƒแƒ แƒ˜แƒก แƒ แƒ”แƒกแƒฃแƒ แƒกแƒ”แƒ‘แƒ˜, แƒแƒ แƒแƒ›แƒ”แƒ“ แƒ›แƒ—แƒ”แƒšแƒ˜ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒ˜แƒก โ€žแƒฉแƒแƒ’แƒ“แƒ”แƒ‘แƒโ€œ แƒ“แƒ โ€žแƒจแƒ”แƒญแƒแƒ›แƒแƒกโ€œ แƒงแƒ•แƒ”แƒšแƒ แƒฎแƒ”แƒšแƒ›แƒ˜แƒกแƒแƒฌแƒ•แƒ“แƒแƒ›แƒ˜ แƒ›แƒ”แƒฎแƒกแƒ˜แƒ”แƒ แƒ”แƒ‘แƒ. แƒแƒ›แƒ˜แƒขแƒแƒ›. แƒ“แƒแƒชแƒ•แƒ แƒฃแƒกแƒแƒกแƒ แƒฃแƒšแƒ แƒ แƒ”แƒ™แƒฃแƒ แƒกแƒ˜แƒ˜แƒกแƒ’แƒแƒœ - แƒžแƒแƒกแƒฃแƒฎแƒ˜แƒกแƒ›แƒ’แƒ”แƒ‘แƒšแƒแƒ‘แƒ แƒ—แƒแƒ•แƒแƒ“ แƒ“แƒ”แƒ•แƒ”แƒšแƒแƒžแƒ”แƒ แƒ–แƒ”.

PostgreSQL-แƒจแƒ˜, แƒ แƒ”แƒ™แƒฃแƒ แƒกแƒ˜แƒฃแƒšแƒ˜ แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒกแƒแƒซแƒšแƒ”แƒ‘แƒšแƒแƒ‘แƒ WITH RECURSIVE แƒ’แƒแƒ›แƒแƒฉแƒœแƒ“แƒ 8.4 แƒ•แƒ”แƒ แƒกแƒ˜แƒ˜แƒก แƒฃแƒฎแƒกแƒแƒ•แƒแƒ แƒ˜ แƒ“แƒ แƒแƒ˜แƒ“แƒแƒœ, แƒ›แƒแƒ’แƒ แƒแƒ› แƒ—แƒฅแƒ•แƒ”แƒœ แƒ™แƒ•แƒšแƒแƒ• แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ แƒ”แƒ’แƒฃแƒšแƒแƒ แƒฃแƒšแƒแƒ“ แƒจแƒ”แƒฎแƒ•แƒ“แƒ”แƒ— แƒžแƒแƒขแƒ”แƒœแƒชแƒ˜แƒฃแƒ แƒแƒ“ แƒ“แƒแƒฃแƒชแƒ•แƒ”แƒš "แƒ“แƒแƒฃแƒชแƒ•แƒ”แƒš" แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ”แƒ‘แƒก. แƒ แƒแƒ’แƒแƒ  แƒ’แƒแƒ•แƒ—แƒแƒ•แƒ˜แƒกแƒฃแƒคแƒšแƒ“แƒ”แƒ— แƒ›แƒกแƒ’แƒแƒ•แƒกแƒ˜ แƒžแƒ แƒแƒ‘แƒšแƒ”แƒ›แƒ”แƒ‘แƒ˜แƒกแƒ’แƒแƒœ?

แƒแƒ  แƒ“แƒแƒฌแƒ”แƒ แƒแƒ— แƒ แƒ”แƒ™แƒฃแƒ แƒกแƒ˜แƒฃแƒšแƒ˜ แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ”แƒ‘แƒ˜

แƒ“แƒ แƒฉแƒแƒฌแƒ”แƒ แƒ”แƒ— แƒแƒ แƒแƒ แƒ”แƒ™แƒฃแƒ แƒกแƒ˜แƒฃแƒšแƒ˜. แƒžแƒแƒขแƒ˜แƒ•แƒ˜แƒกแƒชแƒ”แƒ›แƒ˜แƒ—, แƒ—แƒฅแƒ•แƒ”แƒœแƒ˜ K.O.

แƒกแƒ˜แƒœแƒแƒ›แƒ“แƒ•แƒ˜แƒšแƒ”แƒจแƒ˜, PostgreSQL แƒ’แƒ—แƒแƒ•แƒแƒ–แƒแƒ‘แƒ— แƒกแƒแƒ™แƒ›แƒแƒแƒ“ แƒ‘แƒ”แƒ•แƒ  แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒแƒก, แƒ แƒแƒ›แƒšแƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒแƒช แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒแƒ แƒแƒ แƒ˜แƒก แƒ›แƒ˜แƒ›แƒแƒ แƒ—แƒ”แƒ— แƒ แƒ”แƒ™แƒฃแƒ แƒกแƒ˜แƒแƒก.

แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒ”แƒ— แƒคแƒฃแƒœแƒ“แƒแƒ›แƒ”แƒœแƒขแƒฃแƒ แƒแƒ“ แƒ’แƒแƒœแƒกแƒฎแƒ•แƒแƒ•แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ›แƒ˜แƒ“แƒ’แƒแƒ›แƒ แƒžแƒ แƒแƒ‘แƒšแƒ”แƒ›แƒ˜แƒกแƒแƒ“แƒ›แƒ˜

แƒ–แƒแƒ’แƒฏแƒ”แƒ  แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒฃแƒ‘แƒ แƒแƒšแƒแƒ“ แƒจแƒ”แƒฎแƒ”แƒ“แƒแƒ— แƒžแƒ แƒแƒ‘แƒšแƒ”แƒ›แƒแƒก "แƒกแƒฎแƒ•แƒแƒ“แƒแƒกแƒฎแƒ•แƒ แƒ›แƒฎแƒ แƒ˜แƒ“แƒแƒœ". แƒแƒกแƒ”แƒ—แƒ˜ แƒกแƒ˜แƒขแƒฃแƒแƒชแƒ˜แƒ˜แƒก แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ˜ แƒ›แƒแƒ•แƒ˜แƒงแƒ•แƒแƒœแƒ” แƒกแƒขแƒแƒขแƒ˜แƒแƒจแƒ˜ "SQL HowTo: 1000 แƒ“แƒ แƒ”แƒ แƒ—แƒ˜ แƒ’แƒ–แƒ แƒแƒ’แƒ แƒ”แƒ’แƒแƒชแƒ˜แƒ˜แƒก" - แƒ แƒ˜แƒชแƒฎแƒ•แƒ”แƒ‘แƒ˜แƒก แƒœแƒแƒ™แƒ แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ›แƒ แƒแƒ•แƒšแƒ”แƒ‘แƒ แƒ›แƒแƒ แƒ’แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒแƒ’แƒ แƒ”แƒ’แƒแƒขแƒ˜แƒก แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ แƒ”แƒจแƒ”:

WITH RECURSIVE src AS (
  SELECT '{2,3,5,7,11,13,17,19}'::integer[] arr
)
, T(i, val) AS (
  SELECT
    1::bigint
  , 1
UNION ALL
  SELECT
    i + 1
  , val * arr[i]
  FROM
    T
  , src
  WHERE
    i <= array_length(arr, 1)
)
SELECT
  val
FROM
  T
ORDER BY -- ะพั‚ะฑะพั€ ั„ะธะฝะฐะปัŒะฝะพะณะพ ั€ะตะทัƒะปัŒั‚ะฐั‚ะฐ
  i DESC
LIMIT 1;

แƒ”แƒก แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒจแƒ”แƒ˜แƒชแƒ•แƒแƒšแƒแƒก แƒ›แƒแƒ—แƒ”แƒ›แƒแƒขแƒ˜แƒ™แƒ˜แƒก แƒ”แƒฅแƒกแƒžแƒ”แƒ แƒขแƒ”แƒ‘แƒ˜แƒก แƒ•แƒแƒ แƒ˜แƒแƒœแƒขแƒ˜แƒ—:

WITH src AS (
  SELECT unnest('{2,3,5,7,11,13,17,19}'::integer[]) prime
)
SELECT
  exp(sum(ln(prime)))::integer val
FROM
  src;

แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒ”แƒ— gener_series แƒ›แƒแƒ แƒงแƒฃแƒŸแƒ”แƒ‘แƒ˜แƒก แƒœแƒแƒชแƒ•แƒšแƒแƒ“

แƒ“แƒแƒ•แƒฃแƒจแƒ•แƒแƒ—, แƒ แƒแƒ› แƒฉแƒ•แƒ”แƒœ แƒฌแƒ˜แƒœแƒแƒจแƒ” แƒ“แƒ’แƒแƒก แƒกแƒขแƒ แƒ˜แƒฅแƒแƒœแƒ˜แƒก แƒงแƒ•แƒ”แƒšแƒ แƒจแƒ”แƒกแƒแƒซแƒšแƒ แƒžแƒ แƒ”แƒคแƒ˜แƒฅแƒกแƒ˜แƒก แƒ’แƒ”แƒœแƒ”แƒ แƒ˜แƒ แƒ”แƒ‘แƒ˜แƒก แƒแƒ›แƒแƒชแƒแƒœแƒ 'abcdefgh':

WITH RECURSIVE T AS (
  SELECT 'abcdefgh' str
UNION ALL
  SELECT
    substr(str, 1, length(str) - 1)
  FROM
    T
  WHERE
    length(str) > 1
)
TABLE T;

แƒ“แƒแƒ แƒฌแƒ›แƒฃแƒœแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒฎแƒแƒ แƒ—, แƒ แƒแƒ› แƒแƒฅ แƒ แƒ”แƒ™แƒฃแƒ แƒกแƒ˜ แƒ’แƒญแƒ˜แƒ แƒ“แƒ”แƒ‘แƒแƒ—?.. แƒ—แƒฃ แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ— LATERAL ะธ generate_series, แƒ›แƒแƒจแƒ˜แƒœ แƒแƒ แƒช แƒ™แƒ˜ แƒ“แƒแƒ’แƒญแƒ˜แƒ แƒ“แƒ”แƒ‘แƒแƒ— CTE:

SELECT
  substr(str, 1, ln) str
FROM
  (VALUES('abcdefgh')) T(str)
, LATERAL(
    SELECT generate_series(length(str), 1, -1) ln
  ) X;

แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒ˜แƒก แƒกแƒขแƒ แƒฃแƒฅแƒขแƒฃแƒ แƒ˜แƒก แƒจแƒ”แƒชแƒ•แƒšแƒ

แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒแƒ“, แƒ—แƒฅแƒ•แƒ”แƒœ แƒ’แƒแƒฅแƒ•แƒ— แƒคแƒแƒ แƒฃแƒ›แƒ˜แƒก แƒจแƒ”แƒขแƒงแƒแƒ‘แƒ˜แƒœแƒ”แƒ‘แƒ”แƒ‘แƒ˜แƒก แƒชแƒฎแƒ แƒ˜แƒšแƒ˜ แƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ”แƒ‘แƒ˜แƒ—, แƒ•แƒ˜แƒœ แƒ•แƒ˜แƒก แƒฃแƒžแƒแƒกแƒฃแƒฎแƒ, แƒแƒœ แƒ—แƒ”แƒ›แƒ แƒกแƒแƒชแƒ˜แƒแƒšแƒฃแƒ แƒ˜ แƒฅแƒกแƒ”แƒšแƒ˜:

CREATE TABLE message(
  message_id
    uuid
      PRIMARY KEY
, reply_to
    uuid
      REFERENCES message
, body
    text
);
CREATE INDEX ON message(reply_to);

PostgreSQL แƒแƒœแƒขแƒ˜แƒžแƒแƒขแƒ”แƒ แƒœแƒ”แƒ‘แƒ˜: "แƒฃแƒกแƒแƒกแƒ แƒฃแƒšแƒแƒ‘แƒ แƒแƒ  แƒแƒ แƒ˜แƒก แƒ–แƒฆแƒ•แƒแƒ แƒ˜!" แƒแƒœ แƒชแƒแƒขแƒ แƒ แƒแƒ› แƒ แƒ”แƒ™แƒฃแƒ แƒกแƒ˜แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฎแƒ”แƒ‘
แƒ˜แƒกแƒ”, แƒขแƒ˜แƒžแƒ˜แƒฃแƒ แƒ˜ แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ, แƒ แƒแƒ› แƒ’แƒแƒ“แƒ›แƒแƒฌแƒ”แƒ แƒแƒ— แƒงแƒ•แƒ”แƒšแƒ แƒจแƒ”แƒขแƒงแƒแƒ‘แƒ˜แƒœแƒ”แƒ‘แƒ แƒ”แƒ แƒ— แƒ—แƒ”แƒ›แƒแƒ–แƒ”, แƒแƒกแƒ” แƒ’แƒแƒ›แƒแƒ˜แƒงแƒฃแƒ แƒ”แƒ‘แƒ:

WITH RECURSIVE T AS (
  SELECT
    *
  FROM
    message
  WHERE
    message_id = $1
UNION ALL
  SELECT
    m.*
  FROM
    T
  JOIN
    message m
      ON m.reply_to = T.message_id
)
TABLE T;

แƒ›แƒแƒ’แƒ แƒแƒ› แƒ แƒแƒ“แƒ’แƒแƒœ แƒฉแƒ•แƒ”แƒœ แƒงแƒแƒ•แƒ”แƒšแƒ—แƒ•แƒ˜แƒก แƒ’แƒ•แƒญแƒ˜แƒ แƒ“แƒ”แƒ‘แƒ แƒ›แƒ—แƒ”แƒšแƒ˜ แƒ—แƒ”แƒ›แƒ แƒกแƒแƒฌแƒงแƒ˜แƒกแƒ˜ แƒ’แƒ–แƒแƒ•แƒœแƒ˜แƒšแƒ˜แƒ“แƒแƒœ, แƒ›แƒแƒจแƒ˜แƒœ แƒ แƒแƒขแƒแƒ› แƒแƒ  แƒ’แƒ•แƒญแƒ˜แƒ แƒ“แƒ”แƒ‘แƒ แƒ“แƒแƒแƒ›แƒแƒขแƒ”แƒ— แƒ›แƒ˜แƒกแƒ˜ ID แƒ—แƒ˜แƒ—แƒแƒ”แƒฃแƒš แƒฉแƒแƒœแƒแƒฌแƒ”แƒ แƒก แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒฃแƒ แƒ˜?

-- ะดะพะฑะฐะฒะธะผ ะฟะพะปะต ั ะพะฑั‰ะธะผ ะธะดะตะฝั‚ะธั„ะธะบะฐั‚ะพั€ะพะผ ั‚ะตะผั‹ ะธ ะธะฝะดะตะบั ะฝะฐ ะฝะตะณะพ
ALTER TABLE message
  ADD COLUMN theme_id uuid;
CREATE INDEX ON message(theme_id);

-- ะธะฝะธั†ะธะฐะปะธะทะธั€ัƒะตะผ ะธะดะตะฝั‚ะธั„ะธะบะฐั‚ะพั€ ั‚ะตะผั‹ ะฒ ั‚ั€ะธะณะณะตั€ะต ะฟั€ะธ ะฒัั‚ะฐะฒะบะต
CREATE OR REPLACE FUNCTION ins() RETURNS TRIGGER AS $$
BEGIN
  NEW.theme_id = CASE
    WHEN NEW.reply_to IS NULL THEN NEW.message_id -- ะฑะตั€ะตะผ ะธะท ัั‚ะฐั€ั‚ะพะฒะพะณะพ ัะพะฑั‹ั‚ะธั
    ELSE ( -- ะธะปะธ ะธะท ัะพะพะฑั‰ะตะฝะธั, ะฝะฐ ะบะพั‚ะพั€ะพะต ะพั‚ะฒะตั‡ะฐะตะผ
      SELECT
        theme_id
      FROM
        message
      WHERE
        message_id = NEW.reply_to
    )
  END;
  RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER ins BEFORE INSERT
  ON message
    FOR EACH ROW
      EXECUTE PROCEDURE ins();

PostgreSQL แƒแƒœแƒขแƒ˜แƒžแƒแƒขแƒ”แƒ แƒœแƒ”แƒ‘แƒ˜: "แƒฃแƒกแƒแƒกแƒ แƒฃแƒšแƒแƒ‘แƒ แƒแƒ  แƒแƒ แƒ˜แƒก แƒ–แƒฆแƒ•แƒแƒ แƒ˜!" แƒแƒœ แƒชแƒแƒขแƒ แƒ แƒแƒ› แƒ แƒ”แƒ™แƒฃแƒ แƒกแƒ˜แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฎแƒ”แƒ‘
แƒแƒฎแƒšแƒ แƒ›แƒ—แƒ”แƒšแƒ˜ แƒฉแƒ•แƒ”แƒœแƒ˜ แƒ แƒ”แƒ™แƒฃแƒ แƒกแƒ˜แƒฃแƒšแƒ˜ แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒจแƒ”แƒ›แƒชแƒ˜แƒ แƒ“แƒ”แƒก แƒ›แƒฎแƒแƒšแƒแƒ“ แƒจแƒ”แƒ›แƒ“แƒ”แƒ’แƒ–แƒ”:

SELECT
  *
FROM
  message
WHERE
  theme_id = $1;

แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒ”แƒ— แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒฃแƒšแƒ˜ "แƒšแƒ˜แƒ›แƒ˜แƒขแƒ”แƒ แƒ”แƒ‘แƒ˜"

แƒ—แƒฃ แƒ แƒแƒ˜แƒ›แƒ” แƒ›แƒ˜แƒ–แƒ”แƒ–แƒ˜แƒ— แƒ•แƒ”แƒ  แƒจแƒ”แƒ•แƒซแƒšแƒ”แƒ‘แƒ— แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒ˜แƒก แƒกแƒขแƒ แƒฃแƒฅแƒขแƒฃแƒ แƒ˜แƒก แƒจแƒ”แƒชแƒ•แƒšแƒแƒก, แƒ•แƒœแƒแƒฎแƒแƒ—, แƒ แƒแƒ–แƒ” แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒ“แƒแƒ•แƒ”แƒงแƒ แƒ“แƒœแƒแƒ—, แƒ แƒแƒ—แƒ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒจแƒ˜ แƒจแƒ”แƒชแƒ“แƒแƒ›แƒ˜แƒก แƒแƒ แƒกแƒ”แƒ‘แƒแƒ‘แƒแƒช แƒ™แƒ˜ แƒแƒ  แƒ’แƒแƒ›แƒแƒ˜แƒฌแƒ•แƒ˜แƒแƒก แƒ’แƒแƒฃแƒ—แƒแƒ•แƒ”แƒ‘แƒ”แƒšแƒ˜ แƒ แƒ”แƒ™แƒฃแƒ แƒกแƒ˜แƒแƒ›แƒ“แƒ”.

แƒ แƒ”แƒ™แƒฃแƒ แƒกแƒ˜แƒ˜แƒก แƒกแƒ˜แƒฆแƒ แƒ›แƒ˜แƒก แƒ›แƒ แƒ˜แƒชแƒฎแƒ•แƒ”แƒšแƒ˜

แƒฉแƒ•แƒ”แƒœ แƒฃแƒ‘แƒ แƒแƒšแƒแƒ“ แƒ•แƒ–แƒ แƒ“แƒ˜แƒ— แƒ›แƒ แƒ˜แƒชแƒฎแƒ•แƒ”แƒšแƒก แƒ”แƒ แƒ—แƒ˜แƒ— แƒงแƒแƒ•แƒ”แƒšแƒ˜ แƒ แƒ”แƒ™แƒฃแƒ แƒกแƒ˜แƒ˜แƒก แƒกแƒแƒคแƒ”แƒฎแƒฃแƒ แƒ–แƒ”, แƒกแƒแƒœแƒแƒ› แƒแƒ  แƒ›แƒ˜แƒ•แƒแƒฆแƒฌแƒ”แƒ•แƒ— แƒ–แƒฆแƒ•แƒแƒ แƒก, แƒ แƒแƒ›แƒ”แƒšแƒกแƒแƒช แƒแƒจแƒ™แƒแƒ แƒแƒ“ แƒแƒ แƒแƒแƒ“แƒ”แƒ™แƒ•แƒแƒขแƒฃแƒ แƒแƒ“ แƒ›แƒ˜แƒ•แƒ˜แƒฉแƒœแƒ”แƒ•แƒ—:

WITH RECURSIVE T AS (
  SELECT
    0 i
  ...
UNION ALL
  SELECT
    i + 1
  ...
  WHERE
    T.i < 64 -- ะฟั€ะตะดะตะป
)

Pro: แƒ แƒแƒ“แƒ”แƒกแƒแƒช แƒฉแƒ•แƒ”แƒœ แƒ•แƒชแƒ“แƒ˜แƒšแƒแƒ‘แƒ— แƒชแƒ˜แƒ™แƒšแƒ˜แƒก แƒ’แƒแƒ™แƒ”แƒ—แƒ”แƒ‘แƒแƒก, แƒฉแƒ•แƒ”แƒœ แƒ›แƒแƒ˜แƒœแƒช แƒ’แƒแƒ•แƒแƒ™แƒ”แƒ—แƒ”แƒ‘แƒ— แƒแƒ แƒแƒฃแƒ›แƒ”แƒขแƒ”แƒก แƒ’แƒแƒ›แƒ”แƒแƒ แƒ”แƒ‘แƒ”แƒ‘แƒ˜แƒก แƒ›แƒ˜แƒ—แƒ˜แƒ—แƒ”แƒ‘แƒฃแƒš แƒ–แƒฆแƒ•แƒแƒ แƒก "แƒกแƒ˜แƒฆแƒ แƒ›แƒ˜แƒกแƒ”แƒฃแƒšแƒแƒ“".
Cons: แƒแƒ  แƒแƒ แƒกแƒ”แƒ‘แƒแƒ‘แƒก แƒ’แƒแƒ แƒแƒœแƒขแƒ˜แƒ, แƒ แƒแƒ› แƒฉแƒ•แƒ”แƒœ แƒแƒฆแƒแƒ  แƒ“แƒแƒ•แƒแƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒ— แƒ˜แƒ›แƒแƒ•แƒ” แƒฉแƒแƒœแƒแƒฌแƒ”แƒ แƒก - แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒแƒ“, 15 แƒ“แƒ 25 แƒกแƒ˜แƒฆแƒ แƒ›แƒ”แƒ–แƒ” แƒ“แƒ แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒงแƒแƒ•แƒ”แƒš +10. แƒ“แƒ แƒแƒ แƒแƒ•แƒ˜แƒœ แƒแƒ แƒแƒคแƒ”แƒ แƒก แƒ“แƒแƒžแƒ˜แƒ แƒ“แƒ "แƒกแƒ˜แƒ’แƒแƒœแƒ”แƒ–แƒ”".

แƒคแƒแƒ แƒ›แƒแƒšแƒฃแƒ แƒแƒ“, แƒแƒกแƒ”แƒ—แƒ˜ แƒ แƒ”แƒ™แƒฃแƒ แƒกแƒ˜แƒ แƒฃแƒกแƒแƒกแƒ แƒฃแƒšแƒ แƒแƒ  แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ, แƒ›แƒแƒ’แƒ แƒแƒ› แƒ—แƒฃ แƒงแƒแƒ•แƒ”แƒš แƒกแƒแƒคแƒ”แƒฎแƒฃแƒ แƒ–แƒ” แƒฉแƒแƒœแƒแƒฌแƒ”แƒ แƒ”แƒ‘แƒ˜แƒก แƒ แƒแƒแƒ“แƒ”แƒœแƒแƒ‘แƒ แƒ”แƒฅแƒกแƒžแƒแƒœแƒ”แƒœแƒขแƒฃแƒ แƒแƒ“ แƒ˜แƒ–แƒ แƒ“แƒ”แƒ‘แƒ, แƒงแƒ•แƒ”แƒšแƒแƒ› แƒ™แƒแƒ แƒ’แƒแƒ“ แƒ•แƒ˜แƒชแƒ˜แƒ—, แƒ แƒแƒ’แƒแƒ  แƒ›แƒ—แƒแƒ•แƒ แƒ“แƒ”แƒ‘แƒ...

PostgreSQL แƒแƒœแƒขแƒ˜แƒžแƒแƒขแƒ”แƒ แƒœแƒ”แƒ‘แƒ˜: "แƒฃแƒกแƒแƒกแƒ แƒฃแƒšแƒแƒ‘แƒ แƒแƒ  แƒแƒ แƒ˜แƒก แƒ–แƒฆแƒ•แƒแƒ แƒ˜!" แƒแƒœ แƒชแƒแƒขแƒ แƒ แƒแƒ› แƒ แƒ”แƒ™แƒฃแƒ แƒกแƒ˜แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฎแƒ”แƒ‘แƒ˜แƒฎแƒ˜แƒšแƒ”แƒ— "แƒ›แƒแƒ แƒชแƒ•แƒšแƒ”แƒ‘แƒ˜แƒก แƒžแƒ แƒแƒ‘แƒšแƒ”แƒ›แƒ แƒญแƒแƒ“แƒ แƒแƒ™แƒ˜แƒก แƒ“แƒแƒคแƒแƒ–แƒ”"

"แƒ’แƒ–แƒ˜แƒก" แƒ›แƒชแƒ•แƒ”แƒšแƒ˜

แƒฉแƒ•แƒ”แƒœ แƒ›แƒแƒœแƒแƒชแƒ•แƒšแƒ”แƒแƒ‘แƒ˜แƒ— แƒ•แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ— แƒงแƒ•แƒ”แƒšแƒ แƒแƒ‘แƒ˜แƒ”แƒฅแƒขแƒ˜แƒก แƒ˜แƒ“แƒ”แƒœแƒขแƒ˜แƒคแƒ˜แƒ™แƒแƒขแƒแƒ แƒก, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒจแƒ”แƒ’แƒ•แƒฎแƒ•แƒ“แƒ แƒ แƒ”แƒ™แƒฃแƒ แƒกแƒ˜แƒ˜แƒก แƒ’แƒ–แƒ˜แƒก แƒ’แƒแƒกแƒฌแƒ•แƒ แƒ˜แƒ•, แƒ›แƒแƒกแƒ˜แƒ•แƒจแƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒแƒ แƒ˜แƒก แƒฃแƒœแƒ˜แƒ™แƒแƒšแƒฃแƒ แƒ˜ โ€žแƒ’แƒ–แƒโ€œ แƒ›แƒ˜แƒกแƒ™แƒ”แƒœ:

WITH RECURSIVE T AS (
  SELECT
    ARRAY[id] path
  ...
UNION ALL
  SELECT
    path || id
  ...
  WHERE
    id <> ALL(T.path) -- ะฝะต ัะพะฒะฟะฐะดะฐะตั‚ ะฝะธ ั ะพะดะฝะธะผ ะธะท
)

Pro: แƒ—แƒฃ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒจแƒ˜ แƒแƒ แƒ˜แƒก แƒชแƒ˜แƒ™แƒšแƒ˜, แƒฉแƒ•แƒ”แƒœ แƒแƒ‘แƒกแƒแƒšแƒฃแƒขแƒฃแƒ แƒแƒ“ แƒแƒ  แƒ“แƒแƒ•แƒแƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒ— แƒ˜แƒ›แƒแƒ•แƒ” แƒฉแƒแƒœแƒแƒฌแƒ”แƒ แƒก แƒ’แƒแƒœแƒ›แƒ”แƒแƒ แƒ”แƒ‘แƒ˜แƒ— แƒ˜แƒ›แƒแƒ•แƒ” แƒ’แƒ–แƒแƒ–แƒ”.
Cons: แƒ›แƒแƒ’แƒ แƒแƒ› แƒแƒ›แƒแƒ•แƒ” แƒ“แƒ แƒแƒก, แƒฉแƒ•แƒ”แƒœ แƒจแƒ”แƒ’แƒ•แƒ˜แƒซแƒšแƒ˜แƒ แƒกแƒ˜แƒขแƒงแƒ•แƒแƒกแƒ˜แƒขแƒงแƒ•แƒ˜แƒ— แƒแƒ•แƒฃแƒแƒ แƒแƒ— แƒงแƒ•แƒ”แƒšแƒ แƒฉแƒแƒœแƒแƒฌแƒ”แƒ แƒก แƒกแƒแƒ™แƒฃแƒ—แƒแƒ แƒ˜ แƒ—แƒแƒ•แƒ˜แƒก แƒ’แƒแƒ›แƒ”แƒแƒ แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ แƒ”แƒจแƒ”.

PostgreSQL แƒแƒœแƒขแƒ˜แƒžแƒแƒขแƒ”แƒ แƒœแƒ”แƒ‘แƒ˜: "แƒฃแƒกแƒแƒกแƒ แƒฃแƒšแƒแƒ‘แƒ แƒแƒ  แƒแƒ แƒ˜แƒก แƒ–แƒฆแƒ•แƒแƒ แƒ˜!" แƒแƒœ แƒชแƒแƒขแƒ แƒ แƒแƒ› แƒ แƒ”แƒ™แƒฃแƒ แƒกแƒ˜แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฎแƒ”แƒ‘แƒ˜แƒฎแƒ˜แƒšแƒ”แƒ— "แƒ แƒแƒ˜แƒœแƒ“แƒ˜แƒก แƒ›แƒแƒซแƒ แƒแƒแƒ‘แƒ˜แƒก แƒžแƒ แƒแƒ‘แƒšแƒ”แƒ›แƒ"

แƒ‘แƒ˜แƒšแƒ˜แƒ™แƒ˜แƒก แƒกแƒ˜แƒ’แƒ แƒซแƒ˜แƒก แƒšแƒ˜แƒ›แƒ˜แƒขแƒ˜

แƒ’แƒแƒฃแƒ’แƒ”แƒ‘แƒแƒ  แƒกแƒ˜แƒฆแƒ แƒ›แƒ”แƒ–แƒ” แƒ แƒ”แƒ™แƒฃแƒ แƒกแƒ˜แƒฃแƒšแƒ˜ โ€žแƒฎแƒ”แƒขแƒ˜แƒแƒšแƒ˜แƒกโ€œ แƒกแƒ˜แƒขแƒฃแƒแƒชแƒ˜แƒ˜แƒก แƒ—แƒแƒ•แƒ˜แƒ“แƒแƒœ แƒแƒกแƒแƒชแƒ˜แƒšแƒ”แƒ‘แƒšแƒแƒ“, แƒจแƒ”แƒ’แƒ•แƒ˜แƒซแƒšแƒ˜แƒ แƒ’แƒแƒ•แƒแƒ”แƒ แƒ—แƒ˜แƒแƒœแƒแƒ— แƒฌแƒ˜แƒœแƒ แƒแƒ แƒ˜ แƒ›แƒ”แƒ—แƒแƒ“แƒ˜. แƒแƒœ, แƒ—แƒฃ แƒแƒ  แƒ’แƒ•แƒ˜แƒœแƒ“แƒ แƒแƒ แƒแƒกแƒแƒญแƒ˜แƒ แƒ แƒ•แƒ”แƒšแƒ”แƒ‘แƒ˜แƒก แƒ›แƒฎแƒแƒ แƒ“แƒแƒญแƒ”แƒ แƒ, แƒจแƒ”แƒแƒ•แƒกแƒ”แƒ— แƒ แƒ”แƒ™แƒฃแƒ แƒกแƒ˜แƒ˜แƒก แƒ’แƒแƒ’แƒ แƒซแƒ”แƒšแƒ”แƒ‘แƒ˜แƒก แƒžแƒ˜แƒ แƒแƒ‘แƒ แƒ‘แƒ˜แƒšแƒ˜แƒ™แƒ˜แƒก แƒกแƒ˜แƒ’แƒ แƒซแƒ˜แƒก แƒจแƒ”แƒคแƒแƒกแƒ”แƒ‘แƒ˜แƒ—:

WITH RECURSIVE T AS (
  SELECT
    ARRAY[id] path
  ...
UNION ALL
  SELECT
    path || id
  ...
  WHERE
    id <> ALL(T.path) AND
    array_length(T.path, 1) < 10
)

แƒแƒ˜แƒ แƒฉแƒ˜แƒ”แƒ— แƒ›แƒ”แƒ—แƒแƒ“แƒ˜ แƒ—แƒฅแƒ•แƒ”แƒœแƒ˜ แƒ’แƒ”แƒ›แƒแƒ•แƒœแƒ”แƒ‘แƒ˜แƒ—!

แƒฌแƒงแƒแƒ แƒ: www.habr.com

แƒแƒฎแƒแƒšแƒ˜ แƒ™แƒแƒ›แƒ”แƒœแƒขแƒแƒ แƒ˜แƒก แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ