2015-11-24 6 views
1

У меня есть две таблицы. PartFlights и Parts. A Part может (потенциально) иметь много PartFlights, a PartFlight имеет один и только один Part.Выберите количество записей, у которых есть отношения, у которых есть свои условия отношений?

+----------------------+---------+ 
| part_flights_pivot | part | 
+----------------------+---------+ 
| part_flight_id  | part_id | 
| part_id    |   | 
+----------------------+---------+ 

Вопрос я спрашиваю: Сколько PartFlights будут там повторно использовали Parts?

Получение этого в SQL для меня ужасно для меня. Однако я определил некоторые условия:

  • В конечном счете, мне нужно выражение count, чтобы добавить результат вверх.
  • Мне нужно зарегистрироваться PartFlight до Part.
  • Для Parts, которые были использованы повторно, необходимо исключить первые PartFlight, так как PartFlight не использует повторно используемый Part в то время, но новый.

мне удалось произвести следующий запрос:

SELECT part_flights_pivot.part_flight_id, part_flights_pivot.part_id, COUNT(parts.part_id)-1 as count, SUM(count) FROM part_flights_pivot 
JOIN parts ON part_flights_pivot.part_id=parts.part_id 
GROUP BY (parts.part_id) 
HAVING COUNT(parts.part_id)-1 > 0 

И в то время как он возвращает результаты, я не считаю, что эти результаты являются точно правильными.

+0

Как вы определяете «повторно использовать»? Вы спрашиваете, сколько частей имеют части, которые находятся в других частях боя? – LordBaconPants

+0

@LordBaconPants Не совсем. По аналогии, если летает новая плоскость, этот полет самолета не использует «повторно использованную» плоскость, а новую. Следующий полет самолета для использования этой плоскости, однако, использует то, что можно считать «повторно используемой» плоскостью в том смысле, что она использовалась раньше. – ReactingToAngularVues

+1

Как указано в данных «повторно используется»? –

ответ

1

Так как при условии, что каждый part_flight должен нести один и только один part_id, этот запрос может быть построена только на столе part_flights. Тем не менее, я построил запрос, предполагая, что в таблице деталей есть другие поля. (Если не требуется ничего уникального из таблицы частей это может быть раздели до кода в пределах скобок.) Я считаю, что наш правильный запрос по этим линиям:

select p.*, t.counter 
    from parts p 
    (select part_id, count(*)-1 counter 
    from part_flights_pivot 
    group by part_id 
    having count(*)>1) t 
    where p.part_id = t.part_id  
0

Используйте подзапрос:

SELECT Part.* FROM Part WHERE 
    (SELECT COUNT(*) FROM PartFlight WHERE 
     PartFlight.key = Part.key) > 0 
0

Допуская путем «повторного использования» вы имеете в виду рассчитывать все которые использовали часть во второй раз или более, вы могли бы использовать подзапрос, чтобы набирать частичные полеты для каждой части, а затем подсчитывать частичные рейсы, исключая «первый» рейс части для каждой части (обратите внимание, что вам действительно не нужно присоединиться к «части», чтобы сделать этот счет, хотя вы, вероятно, хотите, чтобы присоединиться к результату, чтобы получить название детали или другие атрибуты):

SELECT 
    part_id, 
    count(*) AS part_reuse_count 
FROM 
(
SELECT 
    @row_number := CASE 
    WHEN @part_id = part_id THEN @row_number + 1 
    ELSE 1 
    END as rownum, 
    @part_id := part_id AS part_id, 
    part_flight_id 
FROM 
    part_flight 
ORDER BY 
    part_id, 
    part_flight_id 
) x 
WHERE 
    rownum <> 1 -- exclude the first part_flight for each part 
GROUP BY 
    part_id 
ORDER BY 
    part_id 

Example on SQLFiddle