【问题标题】:How to union 2 SQL-query in Codeigniter? [duplicate]如何在 Codeigniter 中联合 2 个 SQL 查询? [复制]
【发布时间】:2012-07-03 11:01:35
【问题描述】:

可能重复:
UNION query with codeigniter's active record pattern

我有以下代码:

$language_id=$this->get_language_id($language_code);
$english_id=$this->get_language_id('en');
$query="SELECT e.label_value, t.user_id, t.votes, t.approved, t.language_value FROM labels e left outer join labels t on e.label_value=t.label_value WHERE e.language=$english_id and t.language=$language_id and (t.approved=1 or t.user_id=$user_id) and e.label_value in (select distinct label_value from labels  WHERE language=$english_id order by label_value limit $start_index, 30) order by e.label_value, t.votes";
$query=$this->db->query($query);
$data=$query->result_array();

但我收到以下错误:

This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'

所以,我需要在另一个查询中执行以下部分 "select distinct label_value from labels WHERE language=$english_id order by label_value offset $start limit 30"。请帮帮我,我该如何使用 CodeIgniter?

更新:

有表labels

(label_value, language_value, language) - PK,
user_id,
timestamp,
approved,
votes

我需要从这个表中获取所有查询(例如,它的名称是 t 和 e),标签为 t.label_value、e.label_value(存在)、e.user_id、e.votes、e.timestamp,其中t.label_value=e.label_value(same label), t.language=45 (english language), e.language=24 (my language) and (e.user_id=121234 or e.approved=1)。但是我需要所有条目,如果 (t.label_value!=e.label_value) 我需要使用 NULL 字段获取此条目。

【问题讨论】:

    标签: php mysql codeigniter


    【解决方案1】:

    这是 MySQL 而不是 PHP 或 CI 的限制。为了绕过它,您需要将子查询包装在别名子查询中,使其成为派生表:

    $language_id = $this->get_language_id($language_code);
    $english_id = $this->get_language_id('en');
    $query = "
      SELECT e.label_value, t.user_id, t.votes, t.approved, t.language_value
      FROM labels e
      LEFT OUTER JOIN labels t on e.label_value=t.label_value
      WHERE
        e.language = $english_id
        AND t.language = $language_id
        AND (t.approved = 1 OR t.user_id = $user_id)
        AND e.label_value IN (
          SELECT label_value
          FROM (
            SELECT DISTINCT label_value
            FROM labels
            WHERE language = $english_id
            ORDER BY label_value
            LIMIT $start_index, 30
          ) i
        )
      ORDER BY e.label_value, t.votes
    ";
    $query = $this->db->query($query);
    $data = $query->result_array();
    

    我认为这行得通,如果不行,请告诉我,我会再看一下。

    编辑

    我很难准确地确定您要做什么,但我认为它可能更像这样:

    SELECT t.label_value, t.user_id, t.votes, t.approved, t.language_value
    FROM (
      SELECT DISTINCT label_value
      FROM labels
      WHERE language = $english_id
    ) e
    LEFT JOIN labels t ON e.label_value = t.label_value
    WHERE
      t.language = $language_id
      AND (t.approved = 1 OR t.user_id = $user_id)
    ORDER BY t.label_value, t.votes
    LIMIT $start_index, 30
    

    如果这仍然不正确,请显示一些示例行,以及您希望从这些行中检索的结果集。

    【讨论】:

    • 对不起,这个请求没有返回所有的字符串。
    • 那么查询不正确。请您展示您的表格布局和一些示例数据,以及您希望从表格中得到什么结果?我有一种感觉是e.language = $english_id AND t.language = $language_id 会导致问题,因为您已将表格加入到自身中并且您指定这些值应该不同,但是如果没有看到一些数据就很难知道去哪里以及你希望用它做什么。
    • 当然。我会在 2 分钟内更新问题。
    • 请检查更新的问题。
    猜你喜欢
    • 1970-01-01
    • 2020-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多