SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 14.12.2010 08:49:54

FDL45
Завсегдатай
Зарегистрирован: 29.11.2010
Сообщений: 40

JOIN

Предисловие.
Есть 2 таблицы.
В допустим tab1 суммируются данные из 2-х полей типа sum()+sum() as `pole1`
Суть вопроса.
Нужно объединить  таблицы tab1 и tab2 по уникальному полю.
Но когда я делаю

SELECT sum(`pol1`) as `pol1,`sum(`pol2`) as `pol2`, sum(`poln`) as `poln` FROM `tab1`  JOIN `tab2` ON (`tab1`.`pol1`=`tab2.`pol1`)

возникает ошибка синтаксиса.
И еще вопрос как задать условие выборки из 2-х таблиц?
В одной таблице содержатся данные которые заполняются каждый день.
Есть HTML-форма которая передает параметры месяц и год
как сделать так чтобы данные из 1-й таблицы суммировались за конкретный месяц и год
которые взяты из формы

Неактивен

 

#2 14.12.2010 11:42:53

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: JOIN

Если я правильно понимаю, то вам нужно что-то вроде:

SELECT ... FROM (select sum(`pol1`) as `pol1`,... from`tab1` where ... group by ...) t  JOIN `tab2` ON (t.`pol1`=`tab2.`pol1`)

Неактивен

 

#3 16.12.2010 09:36:52

FDL45
Завсегдатай
Зарегистрирован: 29.11.2010
Сообщений: 40

Re: JOIN

Я так понимаю тут подзапрос нужно писать...я в них не шибко разбираюсь пока что.
Написал что-то...но это корявость еще та.


"SELECT di_report.*, report_eo.* FROM(SELECT `RepPer`, `RepGod`, Depart, sum(`VKopirDoc`) as `VKopirDoc`, sum(`KolTechErr`) as `KolTechErr`, sum(`KolZUKadSt`) as `KolZUKadSt` FROM `di_report` WHERE `RepPer`>='".mysql_real_escape_string($_POST["begin"])."' AND `RepPer`<='".mysql_real_escape_string($_POST["end"])."'  AND `RepGod`>='".mysql_real_escape_string($_POST["bgod"])."') AND `RepGod`<='".mysql_real_escape_string($_POST["egod"])."') `eo_report` INNER JOIN (SELECT DATE_FORMAT(`Date_report`, '%M %Y') as `Date_report`,`Otdel`, sum(`KolNarGKU`) as `KolNarGKU`, sum(`KolNarGKN`) as `KolNarGKN`, sum(`KolLobrg`) as KolLobrg, sum(`KolObrOGV_MS`) as `KolObrOGV_MS` sum(`KolDecl`) as `KolDecl` FROM `report_eo` WHERE `Date_Report`>='".mysql_real_escape_string($_POST["begin"])."-".mysql_real_escape_string($_POST["bgod"])."' AND `Date_Report`<='".mysql_real_escape_string($_POST["end"])."-".$_POST["egod"])."') ON report_eo.Otdel=di_report.Depart";
 

Весь заплет в том, что в одной таблице дата хранится в виде YYYY-MM-DD а во второй В двух разных полях(месяц в одном год в другом). Я моск сломал потому как еще и ORDER BY и WHERE надо будет приплести.

Отредактированно FDL45 (16.12.2010 09:38:46)

Неактивен

 

#4 16.12.2010 10:18:28

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: JOIN

FDL45 написал:

Я так понимаю тут подзапрос нужно писать...я в них не шибко разбираюсь пока что.

Разбираться нужно пробовать на простых примерах
http://sqlinfo.ru/forum/viewtopic.php?pid=20949#p20949

FDL45 написал:

Весь заплет в том, что в одной таблице дата хранится в виде YYYY-MM-DD а во второй В двух разных полях(месяц в одном год в другом). Я моск сломал потому как еще и ORDER BY и WHERE надо будет приплести.

Это вопрос или рассуждение?
Из приведенного запроса не ясно, что вам нужно и в чем собственно ваш вопрос.
Приведите структуру таблиц, набор тестовых данных строк по 10 и желаемый результат. С четкими правилами - что и как вы хотите объединить (с большой вероятностью в том случае вы сами напишите правильный запрос, а нет так понятно будет, что вам подсказать).

Неактивен

 

#5 16.12.2010 12:04:38

FDL45
Завсегдатай
Зарегистрирован: 29.11.2010
Сообщений: 40

Re: JOIN

Накидал задачку
Doc файл прикреплен
Стараюсь пока своими силами.


Прикрепленные файлы:
Attachment Icon ZD.doc, Размер: 72,192 байт, Скачано: 618

Неактивен

 

#6 16.12.2010 14:05:35

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: JOIN

"Суммируются значения полей  KolNarGKU,  KolNarGKN,  KolLobgr,  KolObrOGV_MS,  KolDecl KolZUKPKV из таблицы tab1 за 12 месяц и 2010 год"
Не совсем верно написано, а вопрос терминологии в данном случае важен. Вы не просто суммируете (в этом случае в промежуточной таблице была бы одна строка), а группируете по полю отделу (т.е. используете конструкцию group by otdel).
Колонка Date_Report в промежуточной таблице лишняя, вы ведь не берете её из первой таблицы. Это просто параметры введенные в форме и нет никакого смысла их объединять и вносить в промежуточную таблицу.

"Потом необходимо соединить tab1 и tab2 "
Нет вы объединяете промежуточную таблицу и tab2.
См приведенный мной ранее пример. Там промежуточная таблица названа именем t и объединяется со второй.

и сравнить  Дату которая записана в поле Date_Report с полями RepPer  и RepGod
Правильно будет сравнить параметры введенные в форме  с полями RepPer  и RepGod, т.е. where RepPer=12 and RepGod=2010.


P.S. Я могу, конечно, сразу написать итоговый запрос, но, полагаю, вам самому интересней разобраться.

Неактивен

 

#7 16.12.2010 15:01:53

FDL45
Завсегдатай
Зарегистрирован: 29.11.2010
Сообщений: 40

Re: JOIN

Сразу неинтересно.
Думаю доразбираюсь сам. В любом случае спасибо за поправкуsmile

Неактивен

 

#8 17.12.2010 12:04:18

FDL45
Завсегдатай
Зарегистрирован: 29.11.2010
Сообщений: 40

Re: JOIN

Написал...ошибок нет но вместе с отсутствием ошибок отсутствие данныхsmile
Привожу текст


"SELECT di_report.* FROM(SELECT DATE_FORMAT(`Date_report`,'%Y %m') as `Date_report`, `Otdel`, sum(`KolNarGKU`) as `KolNarGKU`, sum(`KolNarGKN`) as `KolNarGKN`, sum(`KolLobrg`) as `KolLobrg`, sum(`KolObrOGV_MS`) as `KolObrOGV_MS` , sum(`KolKPDA`)+sum(`KolOtkazFZ93`) as `KolVnes93`, sum(`KolDecl`) as `KolDecl` FROM `report_eo` WHERE `Date_Report`>='".mysql_real_escape_string($_POST["bgod"])."-".mysql_real_escape_string($_POST["begin"])."' AND `Date_Report`<='".mysql_real_escape_string($_POST["egod"])."-".mysql_real_escape_string($_POST["end"])."' GROUP BY `Otdel`) rep_eo INNER JOIN di_report ON rep_eo.`Otdel`= di_report.`Depart` WHERE `RepPer`<='".mysql_real_escape_string($_POST["begin"])."' AND  `RepPer`>='".mysql_real_escape_string($_POST["end"])."' AND `RepGod`>='".mysql_real_escape_string($_POST["bgod"])."' AND `RepGod`<='".mysql_real_escape_string($_POST["egod"])."'";
 

Неактивен

 

#9 17.12.2010 17:04:06

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: JOIN

1) "SELECT di_report.* FROM..."  т.е. вы выбираете данные только из второй таблицы, хотя в исходной постановке хотели получить ещё и суммы полей из первой.

2) выполните запрос в клиенте бд, подставив вместо переменных точные значения. Если вернет результат, значит ошибка в php-скрипте. Если результат будет пустой, значит в базе нет данных, соответствующих поставленным условиям. smile

Неактивен

 

#10 20.12.2010 06:46:29

FDL45
Завсегдатай
Зарегистрирован: 29.11.2010
Сообщений: 40

Re: JOIN

SELECT di_report.*,report_eo.* FROM report_eo,(SELECT DATE_FORMAT(`Date_report`,'%Y %m') as `Date_report`, `Otdel`, sum(`KolNarGKU`) as `KolNarGKU`, sum(`KolNarGKN`) as `KolNarGKN`, sum(`KolLobrg`) as `KolLobrg`, sum(`KolObrOGV_MS`) as `KolObrOGV_MS` , sum(`KolKPDA`)+sum(`KolOtkazFZ93`) as `KolVnes93`, sum(`KolDecl`) as `KolDecl` FROM `report_eo` WHERE `Date_Report`>='2010-12' AND `Date_Report`<='2010-12' GROUP BY `Otdel`), `rep_eo` INNER JOIN di_report,(SELECT sum(`KolLU`) as `KolLU`, sum(`PloshLU`) as `PloshLU`, sum(`ObshKolLU `) as `ObshKolLU `, sum(`PloshLUPS`) as `PloshLUPS`, sum(`KolZaprFZ93`) as `KolZaprFZ93`,sum(`KolLogr`) as `KolLogr`, sum(`KolZUKadSt`) as `KolZUKadSt`,sum(`KolTechErr`) as `KolTechErr`,sum(`VKopirDoc`) as `VKopirDoc`, sum(`VsegoPrav`) as `VsegoPrav`, sum(`VnesvGKN`) as `VnesvGKN`,`RepPer`, `RepGod`) as `rep_di` ON rep_eo.`Otdel`= rep_di.`Depart` WHERE `RepPer`<='12' AND `RepPer`>='12' AND `RepGod`>='2010' AND `RepGod`<='2010';

Вобщем я чую что о5 чет перемудрилsmile. В предыдущем запросе кстати ничего не возвращало хотя я и добавлял 2-ю таблицу. Через phpMyAdmin проверял. 0 rows.

Отредактированно FDL45 (20.12.2010 06:48:42)

Неактивен

 

#11 20.12.2010 12:11:34

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: JOIN

Что-то вы совсем не то написали, предыдущий запрос был гораздо лучше.
Запись "FROM report_eo,(SELECT DATE_FORMAT..), `rep_eo`" означает, что вы делаете прямое умножение 3ех таблиц - report_eo, безымянной и `rep_eo`
Запись " di_report,() as `rep_di`"  означает, что вы делаете прямое умножение 2ух таблиц di_report и `rep_di`.


Покажите лучше предыдущий вариант запроса исправленный вами.

Неактивен

 

#12 20.12.2010 12:14:58

FDL45
Завсегдатай
Зарегистрирован: 29.11.2010
Сообщений: 40

Re: JOIN

SELECT di_report.*, report_eo.* FROM(SELECT DATE_FORMAT(`Date_report`,'%Y-%m') as `Date_report`, `Otdel`, sum(`KolNarGKU`) as `KolNarGKU`, sum(`KolNarGKN`) as `KolNarGKN`, sum(`KolLobrg`) as `KolLobrg`, sum(`KolObrOGV_MS`) as `KolObrOGV_MS` , sum(`KolKPDA`)+sum(`KolOtkazFZ93`) as `KolVnes93`, sum(`KolDecl`) as `KolDecl` FROM `report_eo` WHERE `Date_Report`>='2010-12' AND `Date_Report`<='2010-12' GROUP BY `Otdel`) as `rep_eo` INNER JOIN (SELECT sum(`KolLU`) as `KolLU`, sum(`PloshLU`) as `PloshLU`, sum(`ObshKolLU `) as `ObshKolLU `, sum(`PloshLUPS`) as `PloshLUPS`, sum(`KolZaprFZ93`) as `KolZaprFZ93`,sum(`KolLogr`) as `KolLogr`, sum(`KolZUKadSt`) as `KolZUKadSt`,sum(`KolTechErr`) as `KolTechErr`,sum(`VKopirDoc`) as `VKopirDoc`, sum(`VsegoPrav`) as `VsegoPrav`, sum(`VnesvGKN`) as `VnesvGKN`,`RepPer`, `RepGod` FROM `di_report` WHERE `RepPer`<='12' AND `RepPer`>='12' AND `RepGod`>='2010' AND `RepGod`<='2010')) ON rep_eo.`Otdel`= di_report.`Depart`

Вот как-то так...я уже тот вариант переделал. Ругается на то что я алиасы криво использую

Неактивен

 

#13 20.12.2010 12:20:22

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: JOIN

А зачем вы пишите SELECT di_report.*, report_eo.* ? Если вас интересует информация из таблицы `rep_eo`, иначе зачем вы эти суммы считали wink

Неактивен

 

#14 20.12.2010 12:24:18

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: JOIN

Стоп, стоп. А что это у вас за безымянный селект с суммами после inner join
INNER JOIN (SELECT ...) ON rep_eo.`Otdel`= di_report.`Depart`

в 8ом посте у вас этого безобразия не было.

Неактивен

 

#15 20.12.2010 12:34:47

FDL45
Завсегдатай
Зарегистрирован: 29.11.2010
Сообщений: 40

Re: JOIN

Дело в том что мне из 2-й таблицы тоже нужно будет считать суммы.
условие ON(как в 8-м посте) и потом уже писать селект с суммами для 2-й таблицы?
просто хочется уже окончательно с этим доразобраться. Чтобы не дергать светлые умыsmile.

Неактивен

 

#16 20.12.2010 12:45:58

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: JOIN

FDL45 написал:

Дело в том что мне из 2-й таблицы тоже нужно будет считать суммы.

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


FDL45 написал:

условие ON(как в 8-м посте) и потом уже писать селект с суммами для 2-й таблицы?

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

Неактивен

 

#17 21.12.2010 06:45:20

FDL45
Завсегдатай
Зарегистрирован: 29.11.2010
Сообщений: 40

Re: JOIN

Все сделал. Спасибоsmile. Оказалось имена полей при выводе неправильно указалsmile. Ну и запрос чутка переделал
Для 3-х таблиц как я понимаю аналогично?

Текст ниже...возвращает пусто

SELECT 1zk_reports.*,eo_rep.*,di_rep.* FROM(SELECT `Depart`,`RepPer`,`RepGod`, sum(`VsegoPrav`) as `VsegoPrav`, sum(`VnesvGKN`) as `VnesvGKN` FROM `di_report` WHERE `RepPer`>='12' AND `RepPer`<='12' AND `RepGod`>='2010' AND `RepGod`<='2010' AND `Depart`='г.Аша' GROUP BY `Depart`) as di_rep INNER JOIN (SELECT `Otdel`, `Date_Report`, sum(`KolDocKVKPZU`) as `KolDocKVKPZU`, sum(`KolKVKPIzmZU`) as `KolKVKPIzmZU`, sum(`KolOtkazGKU`)+sum(`KolOtkazGKUIzm`) as `OtkazObsh`, sum(`KolOtkazGKUIzm`) as `KolOtkazIzm`, sum(`KolDocZPKVKPZU`) as `KolDocZPKVKPZU`, sum(`KolDocKPT`) as `KolDocKPT`, sum(`KolZKUZDay`) as `KolZKUZ`, sum(`KolZKUVSDay`) as `KolZKUVS` FROM `report_eo` WHERE `Otdel`='г.Аша' GROUP BY `Otdel`) as `eo_rep` ON di_rep.Depart=eo_rep.Otdel INNER JOIN `1zk_reports` ON di_rep.Depart=1zk_reports.Raion WHERE `RepMonth`>='12' AND `RepMonth`<='12' AND `RepGod2`>='2010' AND `RepGod2`<='2010'

И еще пока помню. В предыдущем запросе когда данные передаются то только в том случае когда выбрано одно конкретное значение из списка. Есть ли какое-то значение которое выбирает все значения поля? Спасибо

Отредактированно FDL45 (21.12.2010 11:32:20)

Неактивен

 

#18 21.12.2010 12:52:22

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: JOIN

FDL45 написал:

Для 3-х таблиц как я понимаю аналогично?

Да.

FDL45 написал:

Текст ниже...возвращает пусто

Это значит, что в базе нет данных, соответствующим условиям выборки.
Если вы считаете, что запрос все-таки должен возвращать данные, то выполняйте отдельно каждый подзапрос, смотрите что выбирает и почему итоговая выборка пустая.



FDL45 написал:

И еще пока помню. В предыдущем запросе когда данные передаются то только в том случае когда выбрано одно конкретное значение из списка. Есть ли какое-то значение которое выбирает все значения поля? Спасибо

Отсутствие значения smile Запрос у вас ведь формирует php скрипт. В скрипте нужно смотреть, если не выбрано никакое значение, то в части where запроса не упоминать данное поле, что соответствует тому, что выборка идет по всем значениям данного поля.

Неактивен

 

#19 21.12.2010 13:34:29

FDL45
Завсегдатай
Зарегистрирован: 29.11.2010
Сообщений: 40

Re: JOIN

С последним я разобралсяsmile
Использовал LIKE
И еще запрос приведенный мной выше который по 3-м таблицам верно написан?

Неактивен

 

#20 21.12.2010 13:37:17

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: JOIN

Да (по крайней мере синтаксически wink ).

Неактивен

 

#21 02.02.2011 15:34:00

FDL45
Завсегдатай
Зарегистрирован: 29.11.2010
Сообщений: 40

Re: JOIN

SELECT 1zk_reports.*,eo_rep.*,di_rep.* FROM(SELECT `Depart`,`RepPer`,`RepGod`, sum(`VsegoPrav`) as `VsegoPrav`, sum(`VnesvGKN`) as `VnesvGKN`, sum(`Sredstva`) as `Sredstva` FROM `di_report` GROUP BY `Depart`) as di_rep INNER JOIN (SELECT DATE_FORMAT( `Date_Report`, '%Y-%m') as `Date_Report2`, `Otdel`, sum(`KolDocKVKPZU`) as `KolDocKVKPZU`, sum(`KolKVKPIzmZU`) as `KolKVKPIzmZU`, sum(`KolOtkazGKU`)+sum(`KolOtkazGKUIzm`) as `OtkazObsh`, sum(`KolOtkazGKUIzm`) as `KolOtkazIzm`, sum(`KolDocZPKVKPZU`) as `KolDocZPKVKPZU`, sum(`KolDocKPT`) as `KolDocKPT`, sum(`KolZKUZDay`) as `KolZKUZ`, sum(`KolZKUVSDay`) as `KolZKUVS` FROM `report_eo` WHERE `Otdel` LIKE '%' AND GROUP BY `Otdel`) as `eo_rep` ON di_rep.Depart=eo_rep.Otdel INNER JOIN `1zk_reports` ON di_rep.Depart=1zk_reports.Raion2 WHERE `RepMonth`>='01' AND `RepMonth`<='01' AND `RepGod2`>='2011' AND `RepGod2`<='2011' AND `Date_Report2` >='01-2011' AND `Date_Report2` <= '01-2011'

В чем ошибка?
Нужно чтобы данные суммировались только, допустим, как в данном примере за январь. Данные за февраль уже чтобы не включались
То есть чтобы была сверка по месяцу и году. Дело в том что в одной таблице даты в виде Y-m-d, а в двух других таблицах эти поля отдельные в одном месяц в другом год.
Лучше наверное писать в личку. Объяснил скомкано, времени мало. Спасибо

Неактивен

 

#22 02.02.2011 18:11:56

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: JOIN

В личку писать не удастся, а объяснили скомкано. Попробуйте написать тогда,
когда будет время: Вы же хотите, чтобы мы свое время на нас потратили, правда? wink

Неактивен

 

#23 03.02.2011 08:46:52

FDL45
Завсегдатай
Зарегистрирован: 29.11.2010
Сообщений: 40

Re: JOIN

Вобщем собрался с мыслями. Объясняю
Есть три таблицы

В 1-ю данные заносятся каждый день

Имеет вид
tab1:
Date_Report| Otdel | Параметр1 | Параметр2 | ПараметрN |
2011-01-11 |отдел1| 2                  5                   0
2011-01-12 |отдел1| 2                  8                   1
2011-01-13 |отдел1| 3                  8                   2
....             |         |                       
2011-01-31 |отдел1| 56                 7                   6 
2011-02-01 |отдел1| 6                   9                   3

Отделов всего 26 и каждый из них заносит данные за каждый день. Т.е 1 день = 26 разных записей.

И есть 2-е другие таблицы структуры которых похожи.

tab2:

Depart    | RepGod | RepMonth| Параметр 1 Параметр 2 ПараметрN
Отдел1   | 2011        01                 45            76             6
Отдел2   | 2011        01                 6               6             7
Отдел3   | 2011        01                 56             5             12
...
Отдел26 | 2011       01                  45             8               3
Отдел1 | 2011         02                  12             34             7

tab3:

Raion      | RepGod | RepMonth| Параметр 1 Параметр 2 ПараметрN
Отдел1   | 2011        01               45            76           6
Отдел2   | 2011        01               61            9             8
Отдел3   | 2011        01               566          10           12
...
Отдел26 | 2011        01                42           18            43
Отдел1 | 2011          02                12           34            7


Эти две таблицы содержат данные за конкретный месяц конкретного года.
Данные берутся из формы. Заполняются раз в месяц

Суть задачи такова - объединить эти три таблицы в одну причем из 1-й данные (Параметр1...ПараметрN) должны суммироваться только за тот год и  месяц который указан в 2-х других таблицах. И это должно быть для каждого района. Сейчас у меня просто группировка по району сделана и получается, что данные, которые пришли за февраль тоже войдут в выборку. А этого не нужно. Соответственно если данные пришли в за 2 месяца чтобы суммировались (Параметр1...ПараметрN) за 2 месяца. Т.е 2 записи за, допустим февраль и январь из tab2 и tab3 и данные  с 2011-01-01 по 2011-02-28  включительно из tab1.

Неактивен

 

#24 03.02.2011 11:13:39

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: JOIN

Правильно ли я понимаю, что Вы хотите запрос вида

INSERT INTO tab2
  SELECT YEAR(Date_Report), MONTH(Date_Report), Otdel, SUM(Param1), SUM(Param2), ...
  FROM tab1
  GROUP BY 1, 2, 3
ON DUPLICATE KEY UPDATE Param1 = Param1 + VALUES(Param1), Param2 = Param2 + VALUES(Param2), ...

С уникальным ключом на (Year, Month, Department) должно работать.
И поименуйте все столбцы единообразно: один язык и одинаковые названия wink

Неактивен

 

#25 03.02.2011 12:31:00

FDL45
Завсегдатай
Зарегистрирован: 29.11.2010
Сообщений: 40

Re: JOIN

Сделал по-другому. Работает. Спасибо за потраченное время

Отредактированно FDL45 (03.02.2011 15:17:38)

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson