2013-11-15 19 views
6

Tôi đang làm việc với một ứng dụng sử dụng phpActiveRecord và mySQL để lấy dữ liệu từ mạng cảm biến và vẽ nó lên một số đồ thị flot.js trên máy khách.Trả về mỗi hàng thứ hai của truy vấn SQL

Có một số khung thời gian mà người dùng có thể chọn giữa để ảnh hưởng đến phạm vi dữ liệu mà biểu đồ hiển thị. 2hrs, 24hrs, 3 days and 1 week.

Cảm biến đăng lên cơ sở dữ liệu sau mỗi 60 giây, vì vậy khi vẽ biểu đồ, truy vấn sẽ kéo tất cả các hàng giữa now and DATE_SUB(CUR_DATE - INTERVAL ? DAY) ở đâu? là 1, 3 hoặc 7, v.v.

Tuy nhiên điều này dẫn đến một số lượng lớn hàng được trả về (60,000 + for the full week!) và gây ra sự chậm trễ lớn và lỗi máy chủ.

Tôi biết tôi chỉ có thể tăng bộ nhớ tối đa có sẵn cho các truy vấn trong tệp php.ini, nhưng đây không phải là giải pháp tốt và không giải quyết được vấn đề về tốc độ.

Câu hỏi của tôi là, có cách nào tôi có thể dễ dàng chỉ chọn mọi hàng thứ hai hoặc thứ ba từ phạm vi ngày được yêu cầu tùy thuộc vào độ dài của khoảng thời gian người dùng muốn xem không?

Trong C hoặc Java tôi sẽ làm một cái gì đó giống như một modulo chọn để trả về hàng thay thế nhưng tôi không thể nghĩ ra một cách để làm điều này trong khung hiện hành.

Bất kỳ ý tưởng nào cũng sẽ được đánh giá cao. Cảm ơn.

+3

http://stackoverflow.com/questions/858746/how-do-you-select-every-n-th-row-from-mysql –

+0

Cảm ơn Josh, đây là những liên kết tuyệt vời, nhưng tiếc là cách ứng dụng được tạo có cấu trúc và được tạo động có nghĩa là việc sử dụng các biến người dùng về cơ bản nằm ngoài câu hỏi. Các truy vấn được quản lý bởi khung định tuyến slim.js và không được gọi trực tiếp bởi trang trình duyệt. Tôi đánh giá cao nó mặc dù! Cảm ơn. – bisslad

+1

Nếu id của bạn tăng dần, bạn có thể sử dụng (thêm "lẻ" như hoặc là bội số của 4/8 và tương tự như câu lệnh WHERE) Ngoài ra: Bạn có cân nhắc sử dụng bộ nhớ đệm cho truy vấn của mình không?Thậm chí nếu bạn chỉ đơn giản là có thể sử dụng mysql_result_cache bạn sẽ tăng performace của bạn rất nhiều. –

Trả lời

0
<? 
$row = 1; 
WHILE QUERY { 
    if ($row % 2 == 0) { 
     echo "Yourstuff"; 
    } else { 
     //Nothing 
    } 
    $row++; 
} 
?> 

này sẽ giúp bạn suy nghĩ về một solution..maybe không phải là người hoàn hảo cho bạn, nhưng tôi hy vọng nó sẽ giúp ... Để sử dụng hàng thứ ba $ row% 3 và vân vân ...

+1

Nó giống như đưa 60.000 bánh kẹo về nhà từ thị trường (Cơ sở dữ liệu) và sau đó nói không, tôi chỉ cần mỗi thứ hai và không phải phần còn lại. Tại sao có được chúng từ thị trường (cơ sở dữ liệu) ở nơi đầu tiên? Tại sao không quyết định phải có những gì để lấy lại nhà (để php) –

+0

Tôi sẽ phải thử loại giải pháp ra tôi nghĩ. Đã hy vọng không phải tạo ra hàng ngàn truy vấn nhỏ hơn nhưng đó có thể là cách duy nhất tôi có để làm điều này. Sẽ kiểm tra và chấp nhận khi tôi nhận được điều này. – bisslad

+0

@Hanky ​​Panky: Đây không phải là giải pháp hoàn chỉnh ... nhưng chỉ có một thứ có thể giúp anh ta đi đúng hướng ... một giải pháp khác sẽ là tạo truy vấn cho mỗi hàng ... cho điều này ' sẽ cần id liên tục ... nhưng tôi không biết nếu một truy vấn cho mỗi hàng để đưa ra sẽ nhanh hơn ... –

0

Thử:

$i = 0; 
foreach($row as $data){ 
    if($i == 1){ 
    //Do whatever with your 2n record 
    $i++; 
    } 
    if($i > 1){$i = 0;} //Reset the counter 
} 
+3

Vì vậy, nơi nào bạn tăng $ i;) – douwe

+0

Hà, cũng phát hiện. Xin lỗi, sửa chữa câu trả lời của tôi – ggdx

+0

Thành thật mà nói, vào thời điểm PHP, bạn đã bỏ lỡ một nửa vấn đề. Vâng, bạn tránh gửi nó cho khách hàng nhưng bạn vẫn tìm nạp nó từ đĩa trên cơ sở dữ liệu, chuyển nó qua mạng sang PHP, lưu trữ nó trong bộ nhớ, v.v. ... Điều này tốt hơn không có gì ngoài giải pháp đúng – Basic

0

Trả lại mọi hàng thứ hai cũng không phải là giải pháp lý tưởng. Bạn có thể sử dụng bộ nhớ cache.

Cách dễ nhất là lưu vào bộ nhớ cache bảng của bạn sang bảng khác. Định cấu hình công việc định kỳ cron tự động.

datas 
datas_cache (Only Results) 

Nếu bạn muốn biết thêm giải pháp chuyên nghiệp bạn cần bộ nhớ cache kết quả của bạn vào các tập tin có thể sử dụng JSON

0

Cuối cùng tôi đã kết thúc quản lý để chọn các hàng như quy định ở trên.

Tuy nhiên đây không phải là giải pháp có thể chấp nhận được đối với sự cố tôi đã gặp nên tôi đã quyết định thử và tạo ra phía máy chủ biểu đồ của mình để thử và tránh hoàn toàn vấn đề. Nó có vẻ hợp lý mà tạo ra các biểu đồ với rất nhiều điểm dữ liệu được thực hiện trên máy chủ và chỉ cần đẩy một hình ảnh xuống dây để một vải html5 hoặc một số như vậy. Hãy thử pChart cho việc này. Nhờ tất cả những người trả lời trong mọi trường hợp.

Các vấn đề liên quan