如何在Codeigniter中结合2个SQL查询?

时间:2012-07-03 11:01:36

标签: php mysql codeigniter

  

可能重复:
  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(相同标签),t.language = 45(英语),e.language = 24(我的语言)和(e.user_id = 121234或e.approved = 1)。但我需要所有条目,如果(t.label_value!= e.label_value)我需要使用NULL字段获取此条目。

1 个答案:

答案 0 :(得分:0)

这是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

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