2016-01-19 5 views
-2

Таблица местMySQL Выбор между двумя точками

pid pname 
1  Amsterdam 
2  London 
3  Miami 
4  Bonn  
5  Oslo 
6  Madrid 
7  Lisbon 

Таблица корни

id from to  projectid 
    2 1  3  1 //Project#1 starts from Amsterdam 
    3 3  2  1 //Project#1 ends at London 
    4 3  5  2 //Project#2 starts from Miami and ends at Oslo  
    5 3  5  3 
    6 5  6  3  
    7 4  2  4 
    8 2  4  5 
    9 6  4  6 
    10 4  5  6 

Мне нужен ResultSet, который содержит все начальные и конечные точки, то есть:

start end projectid 
1  2  1 //Amsterdam London 
3  5  2 //Miami Oslo 
3  6  3 
4  2  4 
2  4  5 
6  5  6 

И так, Мне нужен список, который покажет все проекты между двумя городами, например между Лондоном и Бонном:

4  2  4 
2  4  5 
+1

Это два разных вопроса, что вы пробовали? Или хотите, чтобы мы сделали для вас всю работу? –

+0

Что мне делать? У меня есть два вопроса, связанных друг с другом. Должен ли я отправлять два вопроса для каждого из них? – baturalpdincdari

+1

Да, вопросы связаны, но вы arent проявляете какие-либо усилия для решения любого из этих вопросов. Это не бесплатный сервис кода. Попробуйте что-нибудь, и когда вы застряли, попросите конкретную помощь. –

ответ

1

Это предположим, идентификатор в последовательном порядке

Использование переменных Вы назначаете ROWID, чтобы знать, что это первая и последняя запись каждого проекта.

JOIN оба вместе выбрать from из F и тому to от T

SQL Fiddle Demo

SELECT F.`from`, T.`to`, F.`projectid` 
FROM (
     SELECT `id`, `from`, `to`, `projectid`, 
       @row := IF(@prev = `projectid`, 
         @row + 1, 
         IF(@prev := `projectid`, 1, 1) 
         ) as rn 
     FROM roots R 
     CROSS JOIN (SELECT @row = 0 , @prev = 0) x 
     ORDER BY `projectid`, `id` 
    ) F 
JOIN 
    (
     SELECT `id`, `from`, `to`, `projectid`, 
       @row := IF(@prev = `projectid`, 
         @row + 1, 
         IF(@prev := `projectid`, 1, 1) 
         ) as rn 
     FROM roots R 
     CROSS JOIN (SELECT @row = 0 , @prev = 0) x 
     ORDER BY `projectid`, `id` DESC -- HERE ID is DESC to get last entry 
    ) T 
    ON F.`projectid` = T.`projectid` 
and F.`rn` = 1 
and T.`rn` = 1 

OUTPUT

| from | to | projectid | 
|------|----|-----------| 
| 1 | 2 |   1 | 
| 3 | 5 |   2 | 
| 3 | 6 |   3 | 
| 4 | 2 |   4 | 
| 2 | 4 |   5 | 
| 6 | 5 |   6 | 

ПРИМЕЧАНИЕ

Измените демо-запрос на SELECT *, чтобы вы могли проверить, что происходит. Иногда последняя запись равна первой записи.

Ваш второй вопрос зависит от того, считаете ли вы, когда город находится в первом или конце.

SELECT * 
    FROM <previous query> 
    WHERE (`from` = @CityA and `to`= @CityB) 
     OR (`from` = @CityB and `to`= @CityA) 

Потому что, если вы хотите что-то рассматривает в русских городах между гораздо более сложным

+0

Perfect. Огромное спасибо. – baturalpdincdari

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