порядок по определенному полю и другому полю, если он пуст в расширении TYPO3 - PullRequest
0 голосов
/ 29 марта 2012

Я наткнулся на проблему, которую не могу понять.Я делаю список цен на продукты, где он берет цены из трех столбцов (price1, price2, price3), где каждый столбец цен предназначен для конкретной версии этого продукта.

Некоторые продукты могут не иметь цены в цене 1, поскольку в этой версии их цена не существует, а в некоторых продуктах есть цена только в цене 3.

Можно ли получить ЗАКАЗBY будет перечислять продукты, упорядоченные по ценам, поэтому, если продукт, имеющий цену 5400 только в цене3, будет указан после продукта, имеющего цену 5300 в цене1.

Если я ЗАКАЗЫВАЮ по цене1, продуктытот, у которого нет цены в цене1, будет указан вверху.

Я использую расширения наложения TYPO3, где по выражению SQL

tx_overlays::getAllRecordsForTable('*', 'tx_rtmur_bricks', $where, '', 'price1 ASC');

после 'где'GROUP BY

РЕДАКТИРОВАТЬ:

Вот как это указано сейчас:

Product 472
Price pr 1000 pcs: 7.730 in version 3

Product 201
Price pr 1000 pcs: 5.690 in version 1
Price pr 1000 pcs: 7.315 in version 2

Product 301
Price pr 1000 pcs: 5.690 in version 1
Price pr 1000 pcs: 7.315 in version 2

Product 309
Price pr 1000 pcs: 6.760 in version 1
Price pr 1000 pcs: 7.350 in version 3

Я хочу, чтобы это было отсортировано следующим образом:

Product 201
Price pr 1000 pcs: 5.690 in version 1
Price pr 1000 pcs: 7.315 in version 2

Product 301
Price pr 1000 pcs: 5.690 in version 1
Price pr 1000 pcs: 7.315 in version 2

Product 309
Price pr 1000 pcs: 6.760 in version 1
Price pr 1000 pcs: 7.350 in version 3

Product 472
Price pr 1000 pcs: 7.730 in version 3

Ответы [ 3 ]

1 голос
/ 29 марта 2012

Хорошо, вот еще один ответ для вас. Я все еще рекомендую предыдущий, и рефакторинг вашего кода и вашей базы данных потребует некоторой работы, но это не невозможно. Сценарий обновления для вашей базы данных должен быть достаточно простым для написания, чтобы вы могли сохранить все свои данные ..

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

select * from 
 (select id as id, "version 1" as version , price1 as price from tx_rtmur_bricks
    where price1 is not null
  union 
   select id, "version 2", price2 from tx_rtmur_bricks where price2 is not null 
  union 
   select id, "version 3", price3 from tx_rtmur_bricks where price3 is not null
 ) p 
group by p.id, p.price asc;

Итак, вы видите, насколько все сложнее становится ...

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

Редактировать: результат должен быть примерно таким:

Product, Version, Price
123, "Version 1", 5.50
123, "Version 3", 7.50
134, "Version 1", 5.50
134, "Version 2", 6,50
154, "Version 3", 8,50
etc
0 голосов
/ 29 марта 2012

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

SELECT * FROM Product
ORDER BY ProductID, CASE WHEN Price3 IS NULL THEN
CASE WHEN Price2 IS NULL THEN Price1 ELSE Price2 END ELSE Price3 END
0 голосов
/ 29 марта 2012

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

Product_version:
id,
productId (foreign key),
version (name or number..),
price

Это упростит такие запросы и ими будет легче управлять, когда выиметь более или менее ровно 3 версии ..

Ваш запрос будет выглядеть примерно так:

select * from product p 
inner join version v on p.id = v.pid 
group by p.id,  price asc;
...