2011-09-08 10 views
0

非常に単純なselect文で非常に奇妙な問題が発生しています。ここにあります:CodeIgniter Oracle select-random issue

私はcsvファイル(Excelファイルのエクスポートです)を読んでいます。フィールドセパレータは ";"です。各フィールドは「」で囲まれています。

私は2番目、3番目、5番目のフィールドを使用してSELECTを作成し、DB内の情報を探します。言い換えれば、私はテーブルの中の人を彼らの最後の名前とファーストネームに従って探しています。たとえば:

SELECT MAX(n_id_persona) AS n_id_persona 
FROM (
    SELECT DISTINCT MAX(p.n_id_persona) AS n_id_persona 
    FROM PERSONAS p 
    WHERE (NO_ACCENTS(p.d_apellidos) LIKE NO_ACCENTS('%Lastname%') 
     AND NO_ACCENTS(p.d_nombres) LIKE NO_ACCENTS('%Firstname%')) 
    UNION 
    SELECT DISTINCT MAX(p.n_id_persona) AS n_id_persona 
    FROM PERSONAS p 
    LEFT JOIN CORREOS c ON (p.n_id_persona = c.n_id_persona) 
    WHERE ((c.c_correo LIKE '%[email protected]%'))); 

問題はランダムに、CodeIgniterのはどんなN_ID_PERSONAを持っていない、ということですが、私は、Oracle SQL Developerで同じクエリをテストする場合には取得してID。

最初にタイムアウトだと思っていましたが、破棄されました。また、彼らは正しいとは思っていないので、質問を再構成しましたが、ノップです。関数NO_ACCENTS()は、すべてのアクセント文字を対応する文字で置き換え、すべてを大文字で書き出します。私もこのNO_ACCENTS()関数を使用せずに試して、同じ奇妙な結果を得ました。

アイデア?これは誰にも起こりますか?

ありがとうございます!

V

///////////////////////////////////////// //////////////////////////////////

ここでは、コードです:

コントローラ/

public function __construct() 
{ 
    parent::__construct(); 
    $this->output->enable_profiler(TRUE); 
    session_start(); 
} 

public function index() 
{ 
    //Connection info to the DB 

    $_SESSION['c'] = $connection_info; 

    $this->db = $this->load->database($_SESSION['c'], TRUE, TRUE); 
    $this->load->model('Importador_model'); 

    //Reads the csv 
    $this->load->library('csvreader'); 

    $filePath = '/home/vcl/Desktop/CRM/File_name.csv'; 

    $data['csvData'] = $this->csvreader->parse_file($filePath); 

    foreach($data['csvData'] as $linea){ 

     $data['coincidencia'] = $this->Importador_model->Buscar_contacto(str_replace('\'', '\'\'', $linea['Apellido']), str_replace('\'', '\'\'', $linea['Nombre']), $linea['Email']); 

     echo $linea['Apellido'].' '.$linea['Nombre'].''.$linea['Entrevista'].'<br>'; 
     $temp = $data['coincidencia']->row(); 
     echo $temp->N_ID_PERSONA; 
     echo '<br>'; 
    } 
} 

モデル/ importador_model.php

function Buscar_contacto($ape = NULL, $nom = NULL, $email = NULL) 
{ 
$CI =& get_instance(); 

$query = $CI->db->query('SELECT MAX(n_id_persona) AS n_id_persona 
      FROM (
       SELECT DISTINCT MAX(p.n_id_persona) AS n_id_persona 
       FROM PERSONAS p 
       WHERE (NO_ACCENTS(p.d_apellidos) LIKE NO_ACCENTS(\'%'.$ape.'%\') 
        AND NO_ACCENTS(p.d_nombres) LIKE NO_ACCENTS(\'%'.$nom.'%\')) 
       UNION 
       SELECT DISTINCT MAX(p.n_id_persona) AS n_id_persona 
       FROM PERSONAS p 
       LEFT JOIN CORREOS c ON (p.n_id_persona = c.n_id_persona) 
       WHERE ((c.c_correo LIKE \'%'.$email.'%\')))'); 

return $query; 
} 
importador.php

もう少しお手伝いしますか?

+0

「無作為に」と言うときは、_same_パラメータを意味するのはデータを取得することがあり、時にはデータが得られない場合があります。このSQLを呼び出すCodeigniterのPHPコードはどのように見えますか? – Wolf

+0

たとえば、このケースの1は20のうちの1つです。データを取得する予定ですが、データは取得しません。しかし、他のケースでは、同じクエリが完全にうまく機能します。 – Veronica

+0

残りのコードで質問を編集しています。 – Veronica

答えて

0
使用する機能は、時にはあなたは、このように気にいらを試してみてください、あなたのテストcondictionsの間に空白を持つことができる「トリム」ができ

:私はトリムを追加した

SELECTを...

WHERE TRIM((NO_ACCENTS(p.d_apellidos)) LIKE TRIM(NO_ACCENTS('%Lastname%')) 
    AND TRIM(NO_ACCENTS(p.d_nombres)) LIKE TRIM(NO_ACCENTS('%Firstname%'))) 

ノート(no_accents( '%Lastname%'))