2011-09-19 11 views
0

自從我寫了原始SQL以來,我一直希望有人能夠幫助我優化這個SQL查詢,以便它可以跨越MySQL和PostgreSQL。如何優化這個原始SQL,並可能通過CodeIgniter實現它?

我也必須通過使用ActiveRecord的CodeIgniter(2.x)來實現這一點,任何幫助/建議?

 SELECT * 
    FROM notaries, contact_notaries 
    WHERE notaries.id = contact_notaries.notary_id 
AND WHERE ( contact_notaries.city LIKE %$criteria% 
      OR contact_notaries.state LIKE %$criteria 
      OR contact_notaries.address LIKE %$criteria%) 

謝謝!

回答

0
  1. 每個查詢只有一個WHERE條款(你不需要第二個)
  2. 這是更好的把連接條件爲JOIN而不是WHERE
  3. 你確定你真的需要2個表中的所有列(*)嗎?
    所以我想它重構爲

SELECT [field_list]
FROM notaries
INNER JOIN contact_notaries ON (notaries.id = contact_notaries.notary_id)
WHERE (contact_notaries.city LIKE '%$criteria%'
OR contact_notaries.state LIKE '%$criteria'
OR contact_notaries.address LIKE '%$criteria%')

0

使用a1ex07的查詢:

SELECT [field_list] 
FROM notaries 
INNER JOIN contact_notaries ON (notaries.id = contact_notaries.notary_id) 
WHERE (contact_notaries.city LIKE '%$criteria%' 
OR contact_notaries.state LIKE '%$criteria' 
OR contact_notaries.address LIKE '%$criteria%') 

活動記錄:

$this->db->select(); // Leave empty to select all fields 
$this->db->join('contact_notaries', 'notaries.id = contact_notaries.notary_id', 'inner'); 
$this->db->like('contact_notaries.city', 'criteria'); 
$this->db->like('contact_notaries.state', 'criteria'); 
$this->db->like('contact_notaries.address', 'match'); 
$results = $this->db->get('notaries'); 

要指定你可以做字段列表$this->db->select('field_1, field_2, ...');

http://codeigniter.com/user_guide/database/active_record.html