0

重複の可能性:
codeigniter のアクティブなレコード パターンを使用した UNION クエリ

次のコードがあります。

$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.label_value、e.label_value (存在する)、e.user_id、e.votes、e.timestamp を使用して、このテーブルからすべてのクエリを取得する必要があります (たとえば、名前は t および e)。 =e.label_value (同じラベル)、t.language=45 (英語)、e.language=24 (私の言語)、および (e.user_id=121234 または e.approved=1)。しかし、すべてのエントリが必要で、if (t.label_value!=e.label_value) NULL フィールドでこのエントリを取得する必要があります。

4

1 に答える 1

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

これでも正しくない場合は、行の例と、それらの行から取得する結果セットを示してください。

于 2012-07-03T11:07:47.530 に答える