2011-12-22 22 views
5

Cho đến nay, tôi nghĩ rằng học thuyết không có cách chọn một hàng ngẫu nhiên. Vì vậy, tôi nghĩ tôi có một truy vấn để lấy số liệu của hàngDoctrine 2 Chọn ngẫu nhiên một hàng (Offset 0 hoặc 1 indexed)?

// pseudo code 
$count = SELECT COUNT(i) FROM Item i WHERE ... 

Sau đó, có một truy vấn thực để có được những mục sử dụng một ngẫu nhiên bù đắp từ PHP đưa vào setFirstResult

$item = (SELECT i FROM Item WHERE ...)->setMaxResults(1)->setFirstResult(rand(0, $count))->getSingleResult() 

Câu hỏi là, tôi rand() tôi có bắt đầu từ 0 hay 1 không? Sau đó kết thúc? $count hoặc $count-1?

Trả lời

5

setFirstResult() là 0-based.

Tiếp theo cách tiếp cận của bạn, bạn phải sử dụng:

->setFirstResult(rand(0, $count - 1))->setMaxResults(1)->getSingleResult(); 

Nguồn:

Tôi đồng ý tài liệu không rõ ràng về thời điểm đó. Tuy nhiên, chúng ta có thể thấy rằng Doctrine \ DBAL \ Query \ QueryBuilder sử dụng nó như vậy:

->modifyLimitQuery($query, $this->maxResults, $this->firstResult); 

mà sau đó được dịch sang SQL trong Học thuyết \ DBAL \ Platforms \ AbstractPlatform:

final public function modifyLimitQuery($query, $limit, $offset = null) 
{ 
    ... 
    $query .= ' OFFSET ' . $offset; 

OFFSET là 0 dựa trên SQL, chúng ta có thể khấu trừ rằng setFirstResult() là 0 dựa trên là tốt.

0

tôi sử dụng trong ứng dụng của tôi:

$item = (SELECT i FROM Item WHERE ...) 
    ->setMaxResults($count) 
    ->setFirstResult(1)->getSingleResult(); 

bắt đầu đếm từ 1 cho đến khi tổng số hồ sơ

+1

Điều này có chọn một hàng ngẫu nhiên không? Hay bạn có nghĩa là kết quả đầu tiên bắt đầu từ 1? Vì vậy, để chọn một hàng ngẫu nhiên, tôi sẽ làm '-> setMaxResults (1) -> setFirstResult (rand (1, $ count))'? –

+0

Tôi có nghĩa là kết quả đầu tiên là 1 và cuối cùng là tổng số – rkmax

+0

Có lẽ bạn hiểu lầm tôi, tôi muốn một hàng * duy nhất * ngẫu nhiên –

0

Bất kể quý vị bắt đầu từ 0 hoặc 1, bạn phải thực hiện khi kết thúc tương ứng để đếm và đếm -1 tương ứng

+0

Xin lỗi, ý của bạn là gì? Tôi nghĩ rằng chắc chắn có một sự khác biệt nếu tôi sử dụng 0 hoặc 1? –

+0

vâng, có sự khác biệt, việc giải thích diễn ra theo cách đặc tả riêng của nó..r8 .. ??? và do đó nó phụ thuộc vào cách sử dụng –

+0

ý bạn là gì bởi r8? –

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