2013-06-21 2 views
2

Когда я пытаюсь этот код:Нет результата на нескольких присоединитесь с PHP и SQL

$this->db->select('customers.customerid, customers.firstname'); 
$this->db->from('customers'); 

$this->db->join('orders', 'orders.customerid = customers.customerid'); 
$this->db->join('order_domains', 'order_domains.orderid = orders.orderid'); 
$this->db->join('order_hostings', 'order_hostings.orderid = orders.orderid'); 
$this->db->join('order_servers', 'order_servers.orderid = orders.orderid'); 


$this->db->group_by('orders.customerid'); 
$query = $this->db->get(); 

$domainusers = $query->result(); 
var_dump($domainusers); 

Я попытался с помощью внутренних соединений, но до сих пор все, что я пытаюсь возвращает пустой результат:

var_dump(); ---> array(0) { } 

Когда я закомментировать две последние 3 присоединяется:

//$this->db->join('order_hostings', 'order_hostings.orderid = orders.orderid'); 
//$this->db->join('order_servers', 'order_servers.orderid = orders.orderid'); 

Это возвращающие результаты:

var_dump(); ---> array(1) { [0]=> object(stdClass)#17 (1) { ["customerid"]=> string(1) "1" } } 

Я использую codeigniter для этого проекта, не имеет понятия, почему он возвращает пустые результаты, когда я использую несколько соединений?

+1

Логически это происходит потому, что нет соответствия записи по одному или обоим order_hostings или order_servers. – Kickstart

+0

Нет причин, по которым это должно произойти иначе, о чем прокомментировал Кикстарт. Я лично делал это много раз с более чем четырьмя объединениями и столкнулся только с проблемами, когда данные не правильно существуют. – mic

ответ

0

Вы можете использовать следующие в несколько блоков:

$this->db->distinct('orders.customerid'); 
$this->db->from('orders'); 

$this->db->join('order_domains', 'orders.orderid = order_domains.orderid', 'inner'); 
$this->db->join('customers', 'customers.customerid = orders.customerid'); 

$this->db->group_by('orders.customerid'); 
$query = $this->db->get(); 

$domainusers = $query->result(); 
var_dump($domainusers); 
0

Чтобы просмотреть фактический запрос, вы можете запустить $this->db->last_query();. Часто бывает удобно запускать его в клиенте MySQL и играть с запросом, чтобы выяснить, что происходит.

Вы можете также часто используют EXPLAIN в MySQL, чтобы получить некоторые подсказки:

EXPLAIN SELECT customers.customerid, customers.firstname 
FROM customers 
LEFT JOIN... 

и т.д ...

+0

SELECT 'customers'.'customerid' ОТ (' customers') INNER JOIN 'заказывает''''''''пользователя' INNER JOIN' order_hostings' ON ​​'order_hostings'.' orderid' = 'orders' .'orderid' GROUP BY' orders'.'customerid' --------- это запрос, который выглядит как – Edelweiss

+0

. Какой выход вы получаете: 'EXPLAIN SELECT клиенты .customerid FROM (клиенты) INNER JOIN заказы на заказы.customerid = customers.customerid INNER JOIN order_hostings ON order_hostings.orderid = orders.orderid GROUP BY orders.customerid' – BT643

+0

Я сделал снимок, так как в php это не очень читаемо ----> http://snag.gy/w3GgO.jpg – Edelweiss

0

Изменить

$this->db->select('customers.customerid, customers.firstname'); 

Для

$this->db->select('customers.*, orders.*, order_domains.*, order_hostings.*, order_servers.*'); 

Если после того, как что вы получаете некоторые результаты, k eep только необходимые поля из EACH соединенных таблиц в select statement.

+0

, это приводит к «неизвестной таблице order_domains» – Edelweiss

0

Попробуйте изменить эти два на ВНЕШНИЕ СОЕДИНЕНИЯ. Таким образом, если в этих таблицах нет соответствующей записи, это не будет препятствовать возврату строки (только поля из этих таблиц в этом случае будут установлены в NULL).

Не совсем уверен, с CodeIgniter, но думаю, что это будет сделано что-то вроде этого: -

$this->db->select('customers.customerid, customers.firstname'); 
$this->db->from('customers'); 

$this->db->join('orders', 'orders.customerid = customers.customerid'); 
$this->db->join('order_domains', 'order_domains.orderid = orders.orderid'); 
$this->db->join('order_hostings', 'order_hostings.orderid = orders.orderid', 'left'); 
$this->db->join('order_servers', 'order_servers.orderid = orders.orderid', 'left'); 


$this->db->group_by('orders.customerid'); 
Смежные вопросы