Tôi đang tạo ứng dụng trong Symfony 1.4 và Doctrine 1.2 ORM. Tôi khá mới với học thuyết ORM và tôi đang bị treo cổ nhưng tôi không thể giải quyết được vấn đề này.Học thuyết Symfony Truy vấn để tính xếp hạng sau một nhóm theo truy vấn phụ
Tôi có một bảng điểm người dùng (mbScoreByGenre) trong đó một id người dùng có thể có nhiều bản ghi điểm số của người dùng cho một parent_genre. nghĩa là - nhiều người đến số nhiều
Mục tiêu của tôi là tìm thứ hạng của một người dùng cụ thể dựa trên điểm tích lũy của anh ấy cho một parent_genre_id và user_id đã cho. Thuật toán xếp hạng của tôi sử dụng truy vấn con và tôi đã gặp nhiều rắc rối khi xây dựng truy vấn học thuyết hoạt động.
Dưới đây là sơ đồ thuyết của tôi cho mbScoreByGenre
mbScoreByGenre:
actAs:
Timestampable: ~
columns:
id: { type: integer, primary: true, autoincrement: true }
user_id: { type: integer, notnull: true }
genre_id: { type: integer, notnull: true }
parent_genre_id: { type: integer, notnull: true }
score: { type: float, notnull: true, default: 0 }
A. Trước tiên tôi đã cố gắng để làm một cái gì đó như thế này:
$q = Doctrine_Query::create()
->select('((SELECT COUNT(1) AS num
FROM
(SELECT SUM(mbScoreByGenre.score)
WHERE SUM(mbScoreByGenre.score) > SUM(s.score)
AND mbScoreByGenre.parent_genre_id = '.$genre['parent_id'].'
AND s.parent_genre_id = '.$genre['parent_id'].'
GROUP BY mbScoreByGenre.user_id
) + 1) AS rank')
->from('mbScoreByGenre s')
->where('s.user_id = ?', array($user_id))
->groupBy('s.user_id')
->orderBy('rank');
but I got the following error Fatal error: Maximum function nesting level of '100' reached, aborting! in \lib\vendor\symfony-1.4.14\lib\plugins\sfDoctrinePlugin\lib\vendor\doctrine\Doctrine\Query\Tokenizer.php on line 303. I don't understand how to build the subquery so that it works.
B. Vì vậy, sau đó tôi đã thay đổi và cố gắng một cách tiếp cận khác nhau
$q = new Doctrine_RawSql();
$q ->addComponent('s', 'mbScoreByGenre')
->select('COUNT({*}) AS {rank}')
->from('(SELECT SUM(s.score) AS total_score
FROM mb_score_by_genre s
WHERE s.parent_genre_id = '.$genre['parent_id'].'
GROUP BY s.user_id)
')
->where('total_score >= (
SELECT SUM(s.score)
FROM mb_score_by_genre s
WHERE s.parent_genre_id = '.$genre['parent_id'].'
AND s.user_id = '.$user_id.'
GROUP BY s.user_id
)');
Nhưng tôi đã nhận lỗi này: Tất cả các trường được chọn trong truy vấn Sql phải ở định dạng tableAlias.fieldName. Lý do tôi sử dụng Doctrine_RawSql là tôi đọc rằng doctrine 1.2 không hỗ trợ các truy vấn con trong From. Đối với phương pháp này, tôi không thể tìm ra cách tham chiếu cột "total_score" theo định dạng tableAlias.fieldName. Tôi có phải thêm một thành phần trống tham chiếu đến bảng truy vấn con được trả lại cho "total_score" không?
C. Cuối cùng tôi đã cố gắng chạy truy vấn con dưới dạng truy vấn học thuyết và tính toán thứ hạng bằng cách đếm các hàng đối tượng của giáo lý được trả về bởi truy vấn.
$q = Doctrine_Query::create()
->select('SUM(s.score)')
->from('mbScoreByGenre s')
->where('s.parent_genre_id = ?', $genre['parent_id'])
->andWhere('SUM(s.score) > (
SELECT SUM(p.score)
FROM mbScoreByGenre p
WHERE p.parent_genre_id = '.$genre['parent_id'].'
AND p.user_id = '.$user_id.'
GROUP BY p.user_id
)')
->groupBy('s.user_id');
$result = $q->execute();
Nhưng nó mang lại cho tôi những lỗi:
SQLSTATE[HY000]: General error: 1111 Invalid use of group function. Is it because groupBy('s.user_id') and GROUP BY p.user_id, both p and s refer to the same model?
tôi đã thực hiện một tấn sục sạo trên web cho câu trả lời nhưng tôi dường như không thể tìm thấy câu trả lời cho bất kỳ của 3 phương pháp tiếp cận.
Mọi trợ giúp đều tuyệt vời. Cảm kích điều đó.
51 điểm và không có phản ứng? Có điều gì tôi có thể làm để làm cho câu hỏi rõ ràng hơn không? Bất kì sự trợ giúp nào đều được đánh giá cao. – frankp221