Как получить сумму столбца из комбинированных таблиц в MySQL? - PullRequest
1 голос
/ 18 апреля 2009

Я пытался написать оператор MySQL для сценария ниже, но я просто не могу заставить его работать так, как задумано. Я был бы очень признателен, если бы вы, ребята, могли помочь мне сделать это правильно!

У меня есть две таблицы в базе данных mySQL, событие и route :

событие:

id | дата | пункт назначения | водители | пассажиры | описание | казнены

Маршрут:

имя | расстояние

  • drivers содержит строку с именами зарегистрированных драйверов в событии в форме «jack: jill: john».
  • destination содержит назначение события (о, правда?), И его значение всегда совпадает с одним из значений в поле name в таблице route (т. Е. Пункт назначения должен уже существовать в route ).
  • выполнено сообщает, наступает ли событие (0) или уже выполнено (1).
  • расстояние - это расстояние до пункта назначения в км от домашнего местоположения.

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

Например, если Джилл была зарегистрирована как водитель в двух выполненных событиях, где расстояния до пунктов назначения составляют 50 км и 100 км соответственно, я бы хотел, чтобы запрос возвратил значение 150.

Я знаю, что могу использовать что-то вроде ...WHERE drivers LIKE '%jill%' AND executed = 1, чтобы получить выполненные события, где ехала Джилл, и SUM(), чтобы получить общее расстояние, но как мне объединить две таблицы и заставить все это работать?

Ваша помощь очень ценится!

/ Linus

Ответы [ 2 ]

3 голосов
/ 18 апреля 2009

Ответ Стюарта показывает вам, как получить сумму столбца, но я просто хочу отметить, что:

...WHERE drivers LIKE '%jill%'...

вернет любое событие с драйвером, имя которого содержит буквы «jill».

Во-вторых, этот дизайн базы данных не выглядит нормализованным. У вас есть имена водителей и маршруты повторяются. Если вы нормализуете базу данных и у вас есть что-то вроде:

участник

id | name | role

событие

id | date | route_id | description | executed

Маршрут

id | name | distance

participant_event

id | participant_id | event_id

тогда было бы намного легче работать с данными.

Тогда, если вы хотите реализовать поиск пользователей, вы можете сделать запрос:

SELECT id FROM participant WHERE
    name LIKE '%jill%' AND
    role='driver';

Затем, если запрос возвращает более одного результата, разрешите пользователю / приложению выбрать правильный драйвер , а затем запустите SELECT SUM, как запрос Стюарта:

SELECT SUM(r.distance) FROM route r
    JOIN event e ON e.route_id=r.id
    JOIN participant_event pe ON e.id=pe.event_id
    JOIN participant p ON pe.participant_id=p.id
    WHERE p.id=?;

В противном случае единственный способ убедиться, что вы получаете только общее расстояние, пройденное одним драйвером, - это сделать что-то вроде этого (при условии, что drivers разделен запятыми):

...WHERE LCASE(drivers)='jill' OR
    drivers LIKE 'jill, %' OR
    drivers LIKE '%, jill' OR
    drivers LIKE '%, jill,%';
3 голосов
/ 18 апреля 2009

Я не использую MySQL в течение многих лет, поэтому извините, если у меня неправильный синтаксис, но что-то вроде этого должно сделать это:

В универсальном SQL:

select sum(distance) from route
 join event on route.name = event.destination 
 where drivers like '%jill%' AND executed = 1

Или не использовать JOIN:

select sum(distance) from route, event
 where drivers like '%jill%' AND executed = 1
 and route.name = event.destination 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...