2012-07-09 15 views
6

Tôi đang cố gắng xây dựng một chức năng tìm kiếm cho trang web cakephp và mysql. Việc chọn các thông số khác nhau như giá của sản phẩm hoặc độ dài kích hoạt cuộc gọi ajax sẽ trả về số kết quả phù hợp. Tôi muốn mở rộng kết quả trả về với các giá trị tối thiểu và tối đa cho độ dài và giá. Tôi đã thử làm điều này, http://bin.cakephp.org/view/1004813660. Sử dụng 4 lần phát hiện đầu tiên là quá tốn thời gian. Cái cuối cùng hoạt động cục bộ, nhưng tôi gặp lỗi;Tối thiểu và tối đa một trường trong cakephp và mysql

1140 - Trộn các cột GROUP (MIN(), MAX() ,, ...) không có cột GROUP là bất hợp pháp nếu không có GROUP BY clause`

từ xa, do ONLY_FULL_GROUP_BY là trên.

Có thể sử dụng tùy chọn cuối cùng với một số cải tiến hay tôi có thể tắt ONLY_FULL_GROUP_BY không?

Trả lời

0

Tôi đã giải quyết được vấn đề bằng cách thay đổi cách tôi đang tìm kiếm. Thay vì thực hiện các truy vấn trong các điều kiện có thể dẫn đến các phép nối, tôi đã thực hiện tìm kiếm một cách rõ ràng ở đâu.Tôi đã có những thứ như,

$conditions = array('Brand.name LIKE'=> '%bla%'); 

mà tôi thay thế nó với

$condtions = array('Yacht.brand_name LIKE' => '%bla%'); 

tôi phải tái cấu trúc cơ sở dữ liệu một chút, nhưng sự cân bằng giữa tốc độ và chuẩn hóa dữ liệu là một trong những tôi có thể sống với.

1

Cách để thiết lập chế độ máy chủ có thể được tìm thấy ở đây ... Nếu bạn đọc phía trên cùng của tài liệu nó sẽ cho bạn biết làm thế nào để thiết lập giá trị mặc định chế độ máy chủ:

http://dev.mysql.com/doc/refman/5.1/en/server-sql-mode.html

Tuy nhiên, tôi m không chắc chắn đó là cần thiết để có được giải pháp của bạn. Tôi nghĩ rằng truy vấn của bạn đang chạy trong một thời gian dài bởi vì bạn cần một nhóm khác theo mã của bạn và ít truy vấn hơn. Bạn sẽ có thể sử dụng một nhóm logic theo đó sẽ phát huy tối đa khóa chính của bạn (index):

'group' => 'Yacht.id' 

Vì vậy, bạn có một truy vấn trả về tất cả mọi thứ:

$this->Yacht->find('first', array(
'conditions' => $conditions, 
'fields' => array('MAX(Yacht.price) as max_price', 'MIN(Yacht.price) as min_price', ...) 
'group' => 'Yacht.id' 
'order' => '...')); 
+0

Tôi sẽ xem xét tắt khóa sql_mode. Tuy nhiên tôi đã cố gắng nhóm lại. Tuy nhiên, do thực tế là kết quả đầu tiên được trả về, nó sẽ chỉ cho tôi kết quả đối với những gì tôi xác định theo thứ tự. Ví dụ, nếu tôi đặt hàng bởi Yacht.price ASC, nó cho toàn bộ hàng tương ứng với mức giá tối thiểu có thể. Các tham số khác không phải là kết quả mong đợi. – Awemo

2

Nếu tôi hiểu bạn tốt, bạn muốn để có được trong một yêu cầu duy nhất

  • MIN (Yacht.price) như MIN_PRICE
  • MAX (Yacht.price) như MAX_PRICE
  • .210
  • MIN (Yacht.long) như MIN_LENGTH
  • MAX (Yacht.long) như max_length

phải không?

Đối với điều này, bạn không cần bất kỳ mệnh đề "Nhóm theo" nào. Hàm MIN và MAX là các hàm tổng hợp. Nhưng không có gì ngăn cản bạn sử dụng nhiều hàm tổng hợp trong một yêu cầu duy nhất.

Bạn đã thử thực hiện việc này chưa?

$stats = $this->Yacht->find(array(
    'conditions' => $conditions, 
    'fields' => array(
     'MIN(Yacht.price) as min_price', 
     'MAX(Yacht.price) as max_price', 
     'MIN(Yacht.long) as min_length', 
     'MAX(Yacht.long) as max_length' 
    ) 
    ) 
); 

Bằng cách này, theo số documentation, có vẻ như có rất nhiều sự thừa trong mã ban đầu của bạn. "find ('first', array (...))" tự nó đảm bảo bạn chỉ nhận được một kết quả do đó, không cần phải chỉ định "'limit' => 1" trong yêu cầu cũng như mệnh đề "order" vì sẽ chỉ có một trường duy nhất :)

Hy vọng điều đó sẽ hữu ích.

+0

Tôi đã thử điều đó. Nhưng trong khi nó hoạt động trên trang web địa phương, nó không có trên trang web từ xa. Điều này là do "trộn cột nhóm" lỗi mysql. Xem truy vấn cuối cùng ($ allValues). Cảm ơn những người đứng đầu về sự thừa. – Awemo

+0

@Awemo bạn có thể cho chúng tôi phiên bản MySQL của bạn không? Đó có phải là 5.x? – yadutaf

+0

Tôi đang sử dụng phiên bản 5.051a. – Awemo