MySQL内连接/左连接

时间:2014-07-02 23:12:10

标签: php mysql sql join inner-join

我有以下MySQL声明

SELECT * FROM node
        LEFT JOIN field_data_field_featured ON field_data_field_featured.entity_id = node.nid 
        LEFT JOIN field_data_field_mobile_only ON field_data_field_mobile_only.entity_id = node.nid AND field_data_field_mobile_only.field_mobile_only_value = 1
        INNER JOIN field_data_field_related_show ON field_data_field_related_show.entity_id = node.nid 
        WHERE node.status = '1' AND (node.type IN ('game','video','post')) 
        AND field_related_show_nid = 64
        ORDER BY field_featured_value DESC, node.created DESC

它当前返回符合所述条件的所有记录,但我想添加一个条件语句,如果字段类型是游戏,我只想在字段field_mobile_only_value为1时将记录包含在结果集中。

当前SQL的示例记录如下所示

      nid: 351
                    vid: 351
                   type: game
               language: und
                  title: Avalanche at Plankton's Peak
                    uid: 53
                 status: 1
                created: 1403730218
                changed: 1403730218
                comment: 0
                promote: 1
                 sticky: 0
                   tnid: 0
              translate: 0
            entity_type: node
                 bundle: game
                deleted: 0
              entity_id: 351
            revision_id: 351
               language: und
                  delta: 0
   field_featured_value: 0
            entity_type: NULL
                 bundle: NULL
                deleted: NULL
              entity_id: NULL
            revision_id: NULL
               language: NULL
                  delta: NULL
field_mobile_only_value: NULL
            entity_type: node
                 bundle: game
                deleted: 0
              entity_id: 351
            revision_id: 351
               language: und
                  delta: 0
 field_related_show_nid: 64

2 个答案:

答案 0 :(得分:0)

我认为您不能根据选择查询中其他列的值为结果添加列。

为什么不在PHP代码中验证这一点?

如果不是游戏,只需忽略field_mobile_only_value列。

答案 1 :(得分:0)

您可以在WHERE子句中添加类似的内容:

AND ( ( node.type = 'game' 
      AND field_data_field_mobile_only.field_mobile_only_value = 1 
      )
    OR node.type <> 'game'
    )

(我们可以在这里使用不等式运算符,而不关心NULL值,因为先前的谓词已经保证node.type的值不会为NULL。)

如果type'game',那么我们只返回行,如果等于1

否则,如果type不是game,我们允许返回该行。

在更一般的情况下,我们还希望返回NULL值为type的行,使用空安全比较器稍作修改:

AND ( ( node.type = 'game'
      AND field_data_field_mobile_only.field_mobile_only_value = 1
      )
    OR NOT ( node.type <=> 'game' )
    )

会给出相同的结果。