Getting count of results in cakephp - cakephp-2.0

I want to get the count of records from database.
In my table this is the values:
id emp_id number created_emp_id status timestamp
29 7 1 2 0 2012-09-24 15:18:28
30 16 1 2 0 2012-09-24 15:18:28
31 7 2 2 0 2012-09-24 15:18:54
32 19 2 2 0 2012-09-24 15:18:54
i have created_emp_id as 2.
So the result i needed her is 2.
That means the number is a repeated column.
This is the code i wrote for getting result:
$result = $this->TravancoDSRGroup->find('all', array('conditions' => array('created_emp_id= '.$emp_id),'fields' => array('DISTINCT TravancoDSRGroup.number')));
The $result return the two rows only.
But i need to get the count of this query....
Like...
$dsrPageCnt = $this->TravancoDSRGroup->find('count',................
How can i do this?

You can try this:
$dsrPageCnt = $this->TravancoDSRGroup->find('count', array('conditions' => array('created_emp_id= '.$emp_id),'fields' => array('DISTINCT TravancoDSRGroup.number')));
http://book.cakephp.org/1.3/view/1020/find-count

Related

How to aggregate number of notes sent to each user?

Consider the following tables
group (obj_id here is user_id)
group_id obj_id role
--------------------------
100 1 A
100 2 root
100 3 B
100 4 C
notes
obj_id ref_obj_id note note_id
-------------------------------------------
1 2 10
1 3 10
1 0 foobar 10
1 4 20
1 2 20
1 0 barbaz 20
2 0 caszes 30
2 1 30
4 1 70
4 0 taz 70
4 3 70
Note: a note in the system can be assigned to multiple users (for instance: an admin could write "sent warning to 2 users" and link it to 2 user_ids). The first user the note gets linked to is stored differently than the other linked users. The note itself is linked to the first linked user only. Whenever group.obj_id = notes.obj_id then ref_obj_id = 0 and note <> null
I need to make an overview of the notes per user. Normally I would do this by joining on group.obj_id = notes.obj_idbut here this goes wrong because of ref_obj_id being 0 (in which case I should join on notes.obj_id)
There are 4 notes in this system (foobar, barbaz, caszes and taz).
The desired output is:
obj_id user_is_primary notes_primary user_is_linked notes_linked
-------------------------------------------------------------------
1 2 10;20 2 30;70
2 1 30 2 10;20
3 0 2 10;70
4 1 70 1 20
How can I get to this aggregated result?
I hope that I was able to explain the situation clearly; perhaps it is my inexperience but I find the data model not the most straightforward.
Couldn't you simply put this in the ON clause of your join?
case when notes.ref_obj_id = 0 then notes.obj_id else notes.ref_obj_id end = group.obj_id

SQl Server Query with add column value in rows as addition

I have a Table ExamSubjects
ExId,SubId,GroupId,SubOrder,NoQuestions
1 2 1 1 60
1 3 1 2 60
1 1 2 3 120
I want an output in way that column NoQuestions must be added top next column based on groupId
ExId SubId,StartNo,EndNo
1 2 1 60
1 3 61 120
1 1 1 120
Is There any other method other than using loop and temp table.Currently i am using while loop to generate the output
SELECT ExId,SubId,ISNULL((SELECT SUM(NoQuestions) FROM ExamSubjects ex2 WHERE GroupId=ex1.GroupId AND SubOrder<ex1.SubOrder),0)+1 AS StartNo,ISNULL((SELECT SUM(NoQuestions) FROM ExamSubjects ex2 WHERE GroupId=ex1.GroupId AND SubOrder<ex1.SubOrder),0)+NoQuestions
FROM ExamSubjects ex1

Select rows where count() = n

I'm implementing a search functionality where the results should show results page and for each result, the main image and up to 3 more thumbnails.
Right now in the procution version, for each ad it makes 1 select to return the images from the database which it terrible for performance, so I've changed it to a single query that does basically the following:
select * from AdImages order by IsMainImage desc, AdImageId
and returns something like:
AdImageId AdId IsMainImage FilePath
----------- ----------- ----------- ----------------------------------------
1 1 1 9c513f10-5480-4e41-89c6-074b36051999.jpg
5 2 1 f64f9c12-398e-445f-9724-baebe40930b1.jpg
6 4 1 8187d566-b296-4ab0-85e5-b9fc86f293b7.jpg
8 5 1 b8165008-09b3-4258-bf54-043195138344.jpg
10 6 1 86c636ed-f4ed-4f7e-8c7e-fc0b24faa956.jpg
11 7 1 4409a3fd-2bc0-4512-9850-6f5146193e50.jpg
13 8 1 b9b66c48-92b7-479a-a85d-dc6d26b03ebc.jpg
14 9 1 9f3f06ad-4fe1-43a5-8cce-3bb804bb10b7.jpg
16 10 1 016c30dc-5ee8-40d8-9d0f-398f444d7a7b.jpg
19 11 1 e5e56602-1af7-492b-8a8e-b61ac86b751b.jpg
2 1 0 02d44ce1-0de6-4e22-b4ef-043a72e9b5e8.jpg
3 1 0 8c4e19db-faff-44c2-9aab-6a96ab2a8e22.jpg
4 1 0 d8c2464a-277c-40fa-ab43-d2455e819e7e.jpg
7 4 0 d1430ae0-df51-43b7-acea-50d606eee5ba.jpg
9 5 0 b947ae4c-653d-4c27-9edd-567d977e1af3.jpg
12 7 0 3080c947-3769-4762-bb29-f1f9c5303ecd.jpg
15 9 0 d2543ce3-1e65-4a18-80d6-584de0025f1a.jpg
17 10 0 03b26d6a-4e0c-4393-9b5a-d9f2a24d36da.jpg
18 10 0 cde5dacd-3984-4cea-b56f-c3a6c5b82fa0.jpg
20 11 0 9e286ac0-25b1-4a05-af83-26e5d0002c2a.jpg
21 11 0 b1266770-9926-462c-8ec0-e965b21021eb.jpg
22 11 0 0542bd2a-4c4b-41d4-b51b-d311f42f0da9.jpg
23 11 0 b1cc44c9-50c4-4e81-bc9a-a0a4b515e709.jpg
My local db is very small but I could notice a very good performance gain, anyway, I think it could be better if I could make this query return only up to 4 rows for each ad instead of all the rows for each ad as it is doing. But to do so, it should be something like where count(AdId) == 4 which I'm not sure is possible.
I'm also using Entity Framework here. Any extra advice would be very welcome.
Use Window Function
select AdImageId ,AdId ,IsMainImage ,FilePath
from(
select row_number() over(partition by Adid order by IsMainImage desc, AdImageId) rn,*
from AdImages)a
where rn<=4
If I am understanding you correctly, you can just return the TOP xx results.
SELECT TOP(3) * from AdImages order by IsMainImage desc, AdImageId;
This will return only the top 3 results.

Paginator numbers in Cake 2

when I create links in Cake Paginator with:
$this->Paginator->numbers(array('separator' => '', 'modulus' => 2))
I get the result:
1 2 3 4 5 [6] 7 8 9 10
6 - current page
I want result:
1 .. 4 5 [6] 7 8 .. 10
Why option modulus dont working? I think that with modulus =2 result should be that what I want to achieve.
Try to read the documentation first. Modules is the amount of records shown around the page you're on. The documentation explains this pretty clearly:
Uses a modulus to decide how many numbers to show on each side of the
current page By default 8
There is even an example for what you want:
echo $this->Paginator->numbers(array(
'first' => 2,
'last' => 2,
'modulus' => 2
)
);
Output:
1 | 2...5 | 6 | 7...56480 | 56481
Yea I've got a ton of records in that table. ;)
Are you overriding the 'first' and 'last' parameters?
This code should give you what you're after:
echo $this->Paginator->numbers(array(
'separator' => ' ',
'modulus' => 4,
'first' => 1,
'last' => 1
));
On my system it gives the following output:
1...5 6 7 8 9...13

transact SQL, sum each row and insert into another table

for a table on ms-sql2000 containing the following columns and numbers:
S_idJ_id Se_id B_id Status Count multiply
63 1000 16 12 1 10 2
64 1001 12 16 1 9 3
65 1002 17 12 1 10 2
66 1003 16 12 1 6 3
67 1004 12 16 1 10 2
I want to generate an classic asp script which will do the following for each row
where status=1 :
-multiply -> answer= multiply column 'count' with column 'multiply'
Then:
count the total answer and sum for each se_id like :
se_id total
12 47
16 38
17 20
and display on screen like
Rank se_id total
1 12 47
2 16 38
3 17 20
Condition:
if there are multiple equal total values then give the lower numbered se_id a priority for
getting a ranking and give the next higher numbered se_id the next number in rank
Any sample code in classic asp or advice is welcome on how to get this accomplished
'score' = source table.
if (EXISTS (select * from INFORMATION_SCHEMA.TABLES where TABLE_NAME = 'result_table'))
begin
drop table result_table;
end
select
rank = IDENTITY(INT,1,1),
se_id, sum(multiply * count) as total
into result_table
from score
where status = 1
group by se_id
order by total desc, se_id;
[Edit] Change query as answer on first comment

Resources