【问题标题】:order by a specific field and another field if empty in TYPO3 extension如果在 TYPO3 扩展中为空,则按特定字段和另一个字段排序
【发布时间】:2012-04-12 20:11:12
【问题描述】:

我偶然发现了一个我无法弄清楚的问题。我正在为产品制作价格列表,其中的价格来自三列(price1, price2, price3),其中每个价格列都针对该产品的特定版本。

某些产品可能没有价格 1 的价格,因为它在该版本中不存在,而少数产品的价格只有价格 3。

我可以得到一个 ORDER BY 来列出按价格订购的产品,因此如果仅在 price3 中具有价格 5400 的产品将列在 price1 中具有价格 5300 的产品之后。

如果我按价格1 订购,价格1 中没有价格的产品将列在顶部。

我正在使用 SQL 语句所在的 TYPO3 扩展覆盖

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

【问题讨论】:

  • 您能否举例说明您希望结果如何排序。粘贴当前结果的结果并向我们展示您希望如何更改它..

标签: php mysql sql-order-by typo3


【解决方案1】:

我强烈建议重构您的数据库结构并为包含价格的产品版本创建一个单独的表:

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;

【讨论】:

  • Argh.. 我担心这个答案.. 我有大约 80 种产品,每种产品大约 2 种价格和 3 种语言。数据库结构是这样制作的,因为它只应该是一种语言的 2 个价格,我可以按价格 1 排序。没有考虑到这一点。
【解决方案2】:

好的,这是给你的另一个答案。我仍然推荐前一个,重构你的代码和你的数据库需要一些工作,这不是不可能的。数据库的升级脚本编写起来应该相当简单,这样您就可以保留所有数据..

无论如何,这里有一个解决方案。同样,您必须翻译字段名称,因为我使用自己的测试集构建了它:

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

【讨论】:

  • 这似乎做了一些正确的事情,但它只显示一个价格,我想显示每个产品的每个版本的价格。如果产品有版本,它将显示 price1和 price3 并且只有其他产品的价格 1 或 price2。
  • 它将为每个版本显示一行,就像在您的示例中一样。
【解决方案3】:

这是一个长镜头,因为我现在无法测试它。但也许您可以按 CASE 订购?

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-09
    • 2017-06-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多