MySQL: присоединить таблицу к себе - PullRequest
2 голосов
/ 02 октября 2011

У меня есть таблица настроек, которая называется "txp_prefs".Я хотел бы вернуть несколько предпочтений в одну строку;причина, по которой я предпочитаю это простой конкатенации, заключается в том, что я использую плагин в textpattern, который может обрабатывать одну строку.

Вот данные тестирования, которые у меня есть:

------------------------------------------------
|Id | event   | name             |value        |
------------------------------------------------
| 1 | season  | season_start     | 12/10/2011  |
-----------------------------------------------
| 2 | season  | season_end       | 29/10/2011  |
------------------------------------------------
| 3 | season  | season_countdown | 7           |
------------------------------------------------
| 4 | another | test1            | result1     |
------------------------------------------------
| 3 |         | test2            | result2     |
------------------------------------------------

Конечный результат, который я хотел бы получить:

----------------------------------------------------------
|event    | season_start | season_end | season_countdown |
----------------------------------------------------------
|season   | 12/10/2011   | 29/10/2011 | 7                |
----------------------------------------------------------

Я могу (очевидно) создавать отдельные запросы для получения каждого результата независимо;например

SELECT t1.event, t1.val AS season_start FROM txp_prefs t1 WHERE t1.event="season" AND t1.name="season_start" (to get the season_start)
SELECT t2.event, t2.val AS season_end FROM txp_prefs t2 WHERE t2.event="season" AND t2.name="season_end" (to get the season_end)

Но я получаю ошибки, когда пытаюсь соединить их вместе, например, так:

SELECT t1.event, t1.val AS season_start FROM txp_prefs t1 WHERE t1.event="season" AND t1.name="season_start"
LEFT JOIN 
(SELECT t2.event, t2.val AS season_end FROM txp_prefs t2 WHERE t2.event="season" AND t2.name="season_end") t3
ON t1.event=t3.event

В сообщениях об ошибках говорится, что это как-то связано с соединением (что я и так догадался - два отдельных запроса работают.

Любые идеи? Недавно я решил объединить разные таблицы, поэтому я предполагаю, что можно объединить таблицу с самим собой.

Ответы [ 3 ]

1 голос
/ 02 октября 2011

На основе данной структуры вы можете использовать

SELECT 
     MAX(CASE WHEN name = 'season_start' THEN value END) AS season_start,
     MAX(CASE WHEN name = 'season_end' THEN value END) AS season_end,
     MAX(CASE WHEN name = 'season_countdown' THEN value END) AS season_countdown
FROM txp_prefs
WHERE event='season'
0 голосов
/ 02 октября 2011

Вы можете сделать это, поворачивая. Аспер, мой прошлый проект, я хочу показать вам, что следующий запрос будет вам полезен.

Моя транзакция таблицы имеет следующие поля

 NAME VARCHAR2(10)
 branch_code NUMBER(4)
 Ruppes NUMBER(4)


SQL> select * from transaction;

NAME branch_code Ruppes
---------- ---------- ----------
Hemang 2602 1000
Hemang 2603 2000
Hemang 2400 3000
Yash 2602 1500
Yash 2603 1200
Yash 2400 1340
Krupesh 2602 1250
Krupesh 2603 2323
Krupesh 2400 8700

9 выбранных строк.

Теперь поворачиваемся.

SQL> select branch_code, 
  2 max( decode( name, 'Hemang', Ruppes, null ) ) "Hemang",
  3 max( decode( name, 'Yash', Ruppes, null ) ) "Yash",
  4 max( decode( name, 'Krupesh', Ruppes, null ) ) "Krupesh"
  5 from
  6 (
  7 select name, branch_code, Ruppes
  8 from transaction
  9 )
 10 group by branch_code ;

      branch_code Hemang Yash Krupesh
---------- ---------- ---------- ----------
      2602 1000 1500 1250
      2603 2000 1200 2323
      2400 3000 1340 8700
0 голосов
/ 02 октября 2011

выберите то, что вы ищете:

SELECT distinct
          t0.event, 
          t1.val AS season_start , 
          t2.val as seasson_end, 
          t3.val as season_countdown
    FROM 
       txp_prefs t0 
          left outer join
       txp_prefs t1 
          on ( t1.event=t0.event AND t1.name="season_start" )
          left outer join
       txp_prefs t2
          on ( t2.event=t0.event AND t2.name="season_end" )
          left outer join
       txp_prefs t3
          on ( t3.event=t0.event AND t3.name="season_countdown" )
    WHERE 
       t0.event="season"

(стандартный способ получить только одну строку - зарезервированное слово 'distintc'. Другое решение - добавить 'LIMIT 1' к запросу, но это MySQLзависимый)

Вы уверены, что ваша база данных нормализована?

увидимся.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...