SQL选择使用同一表中的不同参数

时间:2014-04-03 17:19:39

标签: php mysql sql join subquery

概念很简单:基于某个id和table2中的字段,从table1获取一个字段,该字段基于table1中不同的id,表示具有最高值的记录中的最高值。所有一个查询,两个表。

我尝试过,加入,子查询,加入和子查询以及所有内容的混合无济于事。如果有人能够做到这一点,他们将受到我最深切的尊重,因为我已经尝试了两天了。以下是伪代码中的步骤:

  1. tables:table1(field1和field3)和table2(field2)
  2. 从table1 field1和table2 field2
  3. 中选择
  4. 根据table1.id
  5. 获取field1
  6. 基于具有最高的table1.id从table2获取field2 field3中的值
  7. 要知道的事情:table2有一个链接到表1的外键。我以不同的方式使用table1中的信息来创建评论及其评论,这些评论基本上是相同的,并且包含相同类型的数据但使用方式不同。我知道谁是父母(评论)和谁是孩子(评论)让他们分开。我试图根据哪个评论具有最多观点来获取评论数据及其描述。例如。

    示例查询:

    SELECT reviews.title, descriptions.description
    FROM reviews, descriptions
    WHERE reviews.id = 1
    AND descriptions.review_id = (
        SELECT id
        FROM reviews
        WHERE views = (
            SELECT MAX(views)
            FROM reviews
            WHERE parent = 1
            -- Parent is the same id used above to select the review
        )
    );
    

    我在大多数查询中得到空集结果我尝试过其他查询只是在views字段中给我重复数据。 我知道有些人可能会说我应该为我的评论制作一个不同的表,但我认为这样可以节省大量的数据库空间,我认为这是一个挑战。提前谢谢大家。

    请注意:请仔细阅读问题 - 如果不完全阅读,则很难理解。

    根据要求:

    table: reviews
    id |   title   | views |
    2    'My Title'    5
    1    'Other Title' 1
    3    'Third Title' 3
    
    table: description
    id |     description      | review_id |
    1     'Good description'       2
    2     'Great description'      1
    3     'Bad description'        3
    

    结果应该是:选择“良好描述”,因为描述链接到具有最多视图的评论。根据传入的内容选择标题。

    title     |  description     |
    'Other Title' 'Good description'
    

1 个答案:

答案 0 :(得分:1)

好的,这适用于SqlServer,不确定MySQL,但它可能会帮助你走上正轨。

Select Top 1 Parent.Title, Descriptions.Description
From Reviews Parent
    inner join Reviews Child
        on Parent.Id = Child.Parent
    inner join Descriptions
        on Child.Id = Descriptions.review_id
Where Parent.Id = 1
Order By Child.[Views] desc

小提琴:http://sqlfiddle.com/#!6/89a76/1

未请求表名称的Psuedo代码

Select Take the Top 1 Parent.Title, Descriptions.Description
From Table1 (The Parent)
  inner join Table1 Back onto itself (The Child)
      linking The parents Id to the Child's Parent
  inner join Table2 onto the Child
      Linking Child's Id to the Descriptions' review_id
Where the parents Id is 1 (or the Passed in value)
Order By The number of views the child had desc