Объединенные результаты в виде имен столбцов - PullRequest
1 голос
/ 08 декабря 2011

У меня есть сценарий Mysql

table1
--------------
id   `7`   `8`
--------------
1    10    20
2    20    30

table 2
---------------
id  code   rel
---------------
3     7     1
4     8     2

Я использую следующее выражение для получения значений

SELECT t2.id, t2.code, 
CASE t2.code WHEN 7 THEN (SELECT `7` FROM table1 t1 where t1.id = t2.rel)
CASE t2.code WHEN 8 THEN (SELECT `8` FROM table1 t1 where t1.id = t2.rel) 
END as val
FROM table2 t2

но это не красиво и не функционально, потому что мне нужно, чтобы эти значения были суммированы, умножены и т. Д., А столбцов много.

Есть ли способ объединить эти таблицы и получить table1. 7 значение для значений t2.rel, t2.code? Нечто похожее на

SELECT t2.id, t2.code, eval(t1.(t2.code))  as val
FROM table2 t2 
JOIN table1 t1 on t2.rel = t1.id

Большое спасибо!

Ответы [ 3 ]

3 голосов
/ 08 декабря 2011

Каждый столбец, на который есть ссылка в запросе SQL, должен быть исправлен во время подготовки запроса.Нет такой вещи как eval.

Однако вы можете использовать значение данных для управления оператором CASE:

SELECT t2.id, t2.code,
  CASE t2.code WHEN '7' THEN t1.`7` WHEN '8' THEN t1.`8` END AS `val`
FROM table2 t2
JOIN table1 t1 ON t2.rel = t1.id;

Но вам придется жестко закодировать вседел, прежде чем подготовить запрос.SQL не может генерировать выражения во время выполнения, поскольку он находит новые значения code в последовательных строках данных.

1 голос
/ 17 декабря 2011

Я не знаю, является ли оно все еще актуальным.

Как вы уже знаете, в MySql нет такой вещи, как pivot, но агрегаты могут выглядеть довольно просто, если определено количество столбцов:

SELECT
  SUM(IF(t2.code = 7, `7`, NULL)) as sum7,
  AVG(IF(t2.code=8, `8`, NULL)) as avg8
FROM t1 JOIN t2
  ON t1.id = t2.rel;
1 голос
/ 08 декабря 2011

Хорошо, мне любопытно, возможно ли то, что вы пытаетесь сделать, но сейчас это может быть решением. Сделайте выбор как это:

SELECT t2.id, t2.code, t1.*
FROM table2 t2 
JOIN table1 t1 on t2.rel = t1.id

В результате

  || *id* || *code* || *id* || *7* || *8* ||
  ------------------------------------------
  || 3    || 7      || 1    || 10  || 20  ||
  || 4    || 8      || 2    || 20  || 30  ||

Затем в вашем коде объединить в ваш результат. Если вы используете php и ваш результат является ассоциативным:

echo $result[$result['code']];

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

...