2017-01-02 1 views
0

У меня есть сайт вопросов и ответов, например stackoverflow. Вот структура некоторых таблиц:Как определить, какой пользователь является верхним в конкретном теге?

-- {superfluous} means some other columns which are not related to this question 

// q&a 
+----+-----------------+--------------------------+------+-----------+-----------+ 
| id |  title  |   body   | type | related | author_id | 
+----+-----------------+--------------------------+------+-----------+-----------+ 
| 1 | How can I ... | I'm trying to make ... | q | NULL  | 3   | 
| 2 |     | You can do that by ... | a | 1   | 1   | 
| 3 | Why should I .. | I'm wonder, why ...  | q | NULL  | 1   | 
| 4 |     | First of all you ...  | a | 1   | 2   | 
| 5 |     | Because that thing ... | a | 3   | 2   | 
+----+-----------------+--------------------------+------+-----------+-----------+ 

// users 
+----+--------+-----------------+ 
| id | name | {superfluous} | 
+----+--------+-----------------+ 
| 1 | Jack |     | 
| 2 | Peter |     | 
| 3 | John |     | 
+----+--------+-----------------+ 

// votes 
+----+----------+-----------+-------+-----------------+ 
| id | user_id | post_id | value | {superfluous} | 
+----+----------+-----------+-------+-----------------+ 
| 1 | 3  | 4  | 1 |     | 
| 2 | 1  | 1  | -1 |     | 
| 3 | 2  | 1  | 1 |     | 
| 4 | 3  | 2  | -1 |     | 
| 5 | 1  | 4  | 1 |     | 
| 6 | 3  | 5  | -1 |     | 
+----+--------+-------------+-------+-----------------+ 

// tags 
+----+------------+-----------------+ 
| id | name | {superfluous} | 
+----+------------+-----------------+ 
| 1 | PHP  |     | 
| 2 | SQL  |     | 
| 3 | MySQL  |     | 
| 4 | HTML  |     | 
| 5 | CSS  |     | 
| 6 | C#   |     | 
+----+------------+-----------------+ 

// q&aTag 
+-------+--------+ 
| q&aid | tag_id | 
+-------+--------+ 
| 1  | 1  | 
| 1  | 4  | 
| 3  | 5  | 
| 3  | 4  | 
| 4  | 6  | 
+-------+--------+ 

Теперь мне нужно найти лучших пользователей в определенном теге. Например, мне нужно найти Peter в качестве главного пользователя в теге PHP. Потому что его ответ на вопрос 1 (у которого есть PHP тег) заработал 2 upvotes. Делает это возможно?

+3

«Делает это возможно?» конечно да – e4c5

+0

@ e4c5 Даже в MySQL? Я знаю, что это возможно в SQLServer, как это сделал stackoverflow. Но я не уверен в MySQL. –

+0

обязательно. Голос пришло не от меня, но это не очень хороший вопрос. Это похоже на множество других вопросов здесь – e4c5

ответ

1

Попробуйте это:

select q1.title, u.id, u.name, sum(v.value) total from `q&a` q1 
left join `q&atag` qt ON q1.id = qt.`q&aid` 
inner join tags t ON qt.tag_id = t.id 
left join `q&a` q2 ON q2.related = q1.id 
left join users u ON q2.author_id = u.id 
left join votes v ON v.post_id = q2.id 

where t.name = 'PHP' 
group by q1.id, u.id 

и здесь просто разделить решение:

Давайте разделим его на подразделы запросы:

  1. получить id тега вы будете искать : select id from tags where name = 'PHP'
  2. получить вопросы по этому тегу: select 'q&aid' from 'q&aTag' where tag_id = 1.
  3. получить id S ответов на этот вопрос: select id, author_id from д & where related in (2.)
  4. получить окончательный запрос: select user_id, sum(value) from votes where post_id in (3.) group by user_id

Объединяя теперь им все дают результат:

select user_id, sum(`value`) total from votes 
where post_id in (
    select id from `q&a` where related in (
     select `q&aid` from `q&aTag` where tag_id IN (
      select id from tags where name = 'PHP' 
     ) 
    ) 
) 
group by user_id 

вы можете добавьте это в конце, если хотите только одну запись:

order by total desc limit 1 
+0

Может быть, прочитайте о JOINs – Strawberry

+0

@Strawberry возьмите его easy;), я просто упрощу ответ, добавлю ответ «join» – wajeeh

+0

Спасибо .. upvote – Shafizadeh