2013-04-13 19 views
12

Ich benutze Codeigniter Active Records Klasse und ich möchte meine users Tabelle mit meiner clients Tabelle, so dass ich die "echten" Namen der Benutzer und nicht nur ihre ID anzeigen können. HierCodeguit Join mit mehreren Bedingungen

ist, was die clients Tabelle wie (Beispiel) sieht und die Spalten a_1, a_2 und a_3 entsprechen meiner users Tisch, insbesondere die user id:

clients 
|--------|---------|----------|-----------|----------| 
| id | name | a_1 | a_2 | a_3 | 
|--------|---------|----------|-----------|----------| 
| 1 | Paul | 2  |  4  | 1  | 

Und meine users Tabelle sieht wie folgt aus:

users 
|--------|---------|----------| 
| id | first | last | 
|--------|---------|----------| 
| 1 | Paul | Blake | 
|--------|---------|----------| 
| 2 | Dan | Doe | 
|--------|---------|----------| 
| 3 | Steve | Smith | 
|--------|---------|----------| 
| 4 | Harry | Jones | 
|--------|---------|----------| 

Also, im wesentlichen, wenn ich von den clients Tabellenwählsignal war und JOIN es, würde es so aussehen:

clients 
|--------|---------|----------|-----------|----------| 
| id | name | a_1 | a_2 | a_3 | 
|--------|---------|----------|-----------|----------| 
| 1 | Paul | Dane Doe |Harry Jones|Paul Blake| 

Bisher habe ich versucht (was nicht funktioniert hat, zeigt es nur den gleichen Namen für alle):

<? 
$this->db 
    ->select('name, a_1, a_2, a_3') 
    ->from('clients') 
    ->join('users', 'users.id=a_1 OR users.id=a_2 OR users.id=a_3'); 

Jede Hilfe wäre toll!

Lösung:

Hier ist, was ich in der Lage war, mit dem kommen Werke (dank Lee @elavarasan):

<? 
$this->db 
    ->select('CONCAT(u1.first," ", u1.last) as a_1_name, CONCAT(u2.first," ", u2.last) as a_2_name, CONCAT(u3.first," ",u3.last) as a_3_name', FALSE) 
    ->from('clients') 
    ->join('users AS u1', 'u1.id=a_1', 'left') 
    ->join('users AS u2', 'u2.id=a_2', 'left') 
    ->join('users AS u3', 'u3.id=a_3', 'left'); 

Antwort

8

@Dodinas: Ich habe die Lösung anhand der Begriffe MySQL Query . Ich finde es schwierig, die Abfrage in CI Active Record zu konvertieren. Aber versuchen Sie dies:

 

    $sql = "SELECT `name`, CONCAT(`u1`.`first`,' ', `u1`.`last`) as a_1, 
          CONCAT(`u2`.`first`,' ', `u2`.`last`) as a_2, 
          CONCAT(`u3`.`first`,' ', `u3`.`last`) as a_3 
      FROM `clients` 
      LEFT JOIN `users` as `u1` ON (`u1`.`id`=`a_1`) 
      LEFT JOIN `users` as `u2` ON (`u2`.`id`=`a_2`) 
      LEFT JOIN `users` as `u3` ON (`u3`.`id`=`a_3`)"; 

    $result = $this->db->query($sql); 


screenshot of the query result taken from PHP Myadmin

+0

Hier in meinem Land die Zeit fast 03.00 n Ich fühle mich schon tot schläfrig. Dats ein weiterer lahmer Grund dafür, die Abfrage nicht in den Active record zu konvertieren ...: P –

+0

Danke! Das hat geholfen. Ich habe es mit Active Records funktionieren, siehe meine Bearbeitung oben. – Dodinas

17

Versuchen Sie, diese

$this->db 
    ->select('*') 
    ->from('clients') 
    ->join('users', 'users.id = clients.a_1 OR users.id=clients.a_2 OR users.id = clients.a_3'); 

$query = $this->db->get(); 

return $query->result();