2014-02-04 5 views
0

Я объясню мою проблему с примером:Counting в сложном запросе

Столы: место - комментарий - activities_comment - деятельность

Пользователь может прокомментировать место и выбрать, какие виды деятельности могут делать в этом месте. Мероприятия, например: бег, плавание, прогулки и подъем.

Так некоторые пользователи будут голосовать более чем 1 активность, поэтому я не могу поставить его прямо в одной и той же таблицы COMMENT, мне нужно создать таблицу pivote ACTIVITIES_COMMENT, проблема здесь идет, я был в состоянии показать все комментарии с их деятельностью выбраны в каждом месте ..

Но сейчас Я хочу подсчитать количество действий и упорядочить их по наиболее выбранным действиям, чтобы они были выбраны пользователями в комментариях для каждого места. Как я могу это сделать ??

Самое лучшее, что я могу сделать, это:

$place = Place::with('city','comments') 
      ->where('id',$placeId)->first(); 


$place->activities = Activity::join('activities_comment', 'activity.id', '=', 'activities_comment.activity_id') 
      ->join('comment', 'comment.id', '=', 'activities_comment.comment_id') 
      ->select('comment.id','activities_comment.activity_id', 
       DB::raw('(SELECT count(activities_comment.activity_id) FROM activities_comment WHERE activities_comment.activity_id = 1) as run'), 
       DB::raw('(SELECT count(activities_comment.activity_id) FROM activities_comment WHERE activities_comment.activity_id = 2) as swim'), 
       DB::raw('(SELECT count(activities_comment.activity_id) FROM activities_comment WHERE activities_comment.activity_id = 3) as walk'), 
       DB::raw('(SELECT count(activities_comment.activity_id) FROM activities_comment WHERE activities_comment.activity_id = 4) as climb'), 
       ) 
      ->where('comment.place_id',$place->id) 
      ->get(); 

Проблема заключается в том, что этот запрос считается наиболее отдельных видов деятельности, но во всех местах, я хочу, чтобы рассчитывать только на каждом месте.


РЕДАКТИРОВАТЬ:

Пример строки:

место стол:

id | name 
---------- 
1 | Alaska 
2 | Peru 
3 | Argentina 

комментарий таблица:

id | user_id | place_id | text 
------------------------------------ 
1 | 1  | 1  | some text 
2 | 3  | 1  | some text 
3 | 2  | 2  | some text 

активность таблица:

id | name 
---------- 
1 | run 
2 | swim 
3 | walk 
4 | climb 

activity_comment стол:

id | comment_id | activity_id 
------------------------------ 
1 | 1   | 1   
2 | 1   | 2   
3 | 2   | 2  
4 | 3   | 2 

Когда я получаю в комментариях на Аляске, я хотел бы видеть время, что пользователи выбрали активность там, аляска будет показано:

run: 1 time 
swim: 2 times 
walk: 0 times 
climb: 0 times 

Если я иду в Перу комментарии:

run: 0 times 
swim: 1 time 
walk: 0 times 
climb: 0 times 

Спасибо заранее.

+0

вы посмотрели GROUP BY - я пытаюсь понять, что вы хотите точно от вашего вопроса но общий jist GROUP BY, похоже, дает то, что вы хотите, - можете ли вы уточнить, добавив небольшую пробную строку с 3/4 строками и возвращаемый запрос? –

+0

Я добавлю это через секунду .. мне нужно добавить условное выражение в каждый выбор raw, я думаю, чтобы считать активность только для одного места в то время. – Luco

+0

Я просто отредактировал его :) – Luco

ответ

0

Во-первых, получите таблицы, все связанные через соединения, показывающие, как каждая таблица связана со следующей их соответствующими ключами.Затем, это просто вопрос каждого имени (город/местоположение), а также название мероприятия и получение счета, сгруппированного по соответствующему местоположению и активности. Порядка по п приложит все же места, а затем в каждом месте будет поставить самую высокую активность счетчика вторичной ... если таковые имеют одинаковые отсчеты, то имена будут альфа упорядоченного

SELECT 
     p.name, 
     a.name as Activity, 
     COUNT(*) as NumComments 
    from 
     place p 
     join comment c 
      ON p.id = c.place_id 
      join activity_comment ac 
       ON c.id = ac.comment_id 
       join activity a 
        ON ac.activity_id = a.id 
    group by 
     p.name, 
     a.name 
    order by 
     p.name, 
     COUNT(*) desc, 
     a.name 

Теперь вы будете просто нужно подключить предложение WHERE (до группы) для любого местоположения или деятельности, которые могут вас заинтересовать.

+0

Спасибо, работает, и это не сложно – Luco

Смежные вопросы