【问题标题】:How to bump most helpful reviews to the top?如何将最有用的评论推到顶部?
【发布时间】:2019-10-03 04:44:18
【问题描述】:

想象一下,我有一堆产品,每个产品都有一个评论部分,如果有人留下了很好的评论,他们的评论会得到一个赞,以告知其他用户发现它有帮助。

我有一个名为 CustomerReview 的表,还有一个名为 likeReview 的表,在这个表 (likeReview) 内我有一列:

isLike(值为真、假或空)

我需要让这张表将最有帮助的评论排在列表顶部。

我应该怎么做?

我的 SQL 尝试让 isLike 执行此操作时出错,因为存在与 likeReview 表无关的评论 (CustomerReview)。

SELECT {c.pk} 
FROM{ CustomerReview as c LEFT JOIN LikeReview as l ON {c.pk} = {l.pk} } 
WHERE {c.product}=?product 
  AND {c.LANGUAGE}=?language 
ORDER BY   {l.ISLIKE } ;

我的 items.xml

        <relation code="Review2User" localized="false"
              generate="true" autocreate="true">
        <sourceElement qualifier="likeReview" type="LikeReview"
                       cardinality="many" >
        </sourceElement>
        <targetElement qualifier="customerReview" type="CustomerReview"
                       cardinality="one">
        </targetElement>
    </relation>

关系

        <typegroup name="LikeReview">
        <itemtype code="LikeReview" autocreate="true" generate="true">
            <deployment table="likeReview" typecode="15088"/>

            <attributes>
                <attribute type="Customer" qualifier="customer" >
                    <modifiers optional="false" unique="true"/>
                    <persistence type="property"/>
                </attribute>
                <attribute type="CustomerReview" qualifier="review" >
                    <modifiers optional="false" unique="true"/>
                    <persistence type="property"/>
                </attribute>
                <attribute qualifier="isLike" type="java.lang.Boolean">
                    <defaultvalue>Boolean.FALSE</defaultvalue>
                    <persistence type="property"/>
                </attribute>
            </attributes>
        </itemtype>
    </typegroup>

【问题讨论】:

  • 您能否详细说明您如何维护这些项目类型之间的关系。最好在此处添加它的声明 (*items.xml),这将有助于我正确理解您的问题。
  • 添加我的 items.xml

标签: java hybris flexible-search


【解决方案1】:

我认为您需要聚合。像这样的:

SELECT {c.pk}
FROM { CustomerReview c LEFT JOIN
     LikeReview l
     ON {c.pk +"} = {l.pk} }
WHERE {c.product} = ?product AND
      {c.LANGUAGE +} = ?language
GROUP BY {c.pk}
ORDER BY SUM(CASE WHEN {l.ISLIKE } = "true" THEN 1 ELSE 0 END) DESC

【讨论】:

  • 嗨,Gordon,我认为您的代码是必要的,但是当 因为存在与 likeReview 表无关的评论 (CustomerReview) 时,它会起作用吗?
  • @ScaryWombat 。 . .是的,LEFT JOIN 负责处理。
  • 我最好重新打开这个问题 ;-)
  • 我尝试了您的解决方案,但我得到了同样的错误:无法搜索未知字段 'TableField(name='isLike',langPK='null',type=CustomerReview)'
  • 请注意,hybris 并没有真正使用 SQL,它使用“灵活搜索”,这与 SQL 类似,但语法不同,仅支持现代 SQL 的一小部分功能跨度>
【解决方案2】:

尝试使用ON {c.pk} = {l.customerReview}加入

SELECT {c.pk}
FROM { CustomerReview c LEFT JOIN
     LikeReview l
     ON {c.pk} = {l.customerReview} }
WHERE {c.product} = ?product AND
      {c.LANGUAGE} = ?language
GROUP BY {c.pk}
ORDER BY SUM(CASE WHEN {l.ISLIKE} = "true" THEN 1 ELSE 0 END) DESC

【讨论】:

  • 谢谢,它成功了。我只需要将“true”更改为“1”
  • 我建立的关系正确吗?我可以改进什么?为什么 {c.pk} = {l.customerReview} 工作而不是 {c.pk} = {l.pk}?
  • 是的,我认为您声明的关系只是正确的。如果在交叉表中生成一对多关系限定符,则说过 customerReview 限定符在具有 CustomerReviewModel PK 的 LikeReviewModel 中生成
  • {c.pk} = {l.pk} 不会,因为它是各个表的 pk 并且具有不同的值,不会相互匹配
  • @FelipeMarcelo - 我认为你可以从LikeReview ItemType 中删除review 属性,因为你已经有一个关系声明,它会在你的LikeReviewModel 中生成customerReview 属性
猜你喜欢
  • 1970-01-01
  • 2019-04-02
  • 2020-01-14
  • 1970-01-01
  • 2011-02-12
  • 2012-06-23
  • 2020-02-29
  • 2016-08-09
  • 1970-01-01
相关资源
最近更新 更多