쿼리 결과를 임시로 저장하여 다른 쿼리에 사용하는 방법은 무엇입니까?


12

나는 당신이 나를 도울 수 있다고 생각하는이 문제가 있습니다.
추신 : 나는 이것을 어떻게 부르는지 잘 모르겠습니다. 따라서 더 적합한 제목을 찾으면 편집하십시오.

배경

  • 나는 버스 노선을 검색하기 위해이 응용 프로그램을 만들고 있습니다.
  • 버스 노선은 3 자리 숫자이며 고유하며 변경되지 않습니다.
  • 정지 A에서 정지 B까지 라인을 검색 할 수 있어야합니다.
  • 사용자 인터페이스는 이미 유효한 중지 이름 만 사용하도록 사용자에게 힌트를주었습니다.
  • 경로에 직통 노선이있는 경우 표시 할 수 있어야하며, 그렇지 않은 경우 2 줄 및 3 줄 조합을 표시해야합니다.

예:

지점 A에서 지점 D로 이동해야합니다. 프로그램에 다음이 표시되어야합니다.

  • 직통 광고가있는 경우
  • 그렇지 않으면 AC, CD와 같은 대체 2 라인 콤보를 표시하십시오.
  • 2 라인 콤보가없는 경우 AB, BC, CD의 3 라인 콤보를 검색하십시오.

물론, 버스 라인 번호와 버스 전환시기를 앱에 표시해야합니다.

내가 가진 것 :

내 데이터베이스는 다음과 같이 구성됩니다 (간단한 실제 데이터베이스에는 위치 및 시간이 포함됩니다).

+-----------+
| bus_stops |
+----+------+
| id | name |
+----+------+

+-------------------------------+
|    lines_stops_relationship   |
+-------------+---------+-------+
|  bus_line   | stop_id | order |
+-------------+---------+-------+

여기서 lines_stops_relationship버스 라인과 정지 사이 대다 관계를 설명한다.

순서, 정지가 한 줄로 나타나는 순서를 나타냅니다. 모든 선이 앞뒤로 이동하는 것은 아니며 순서에 의미가 있습니다 (순서 2의 점 A는 순서 1의 점 B 뒤에옵니다).

문제

  • 우리는 노선이 경로를 쉽게 통과 할 수 있는지 알아냅니다. 올바른 순서로 두 지점을 통과하는 단일 라인을 검색하십시오.
  • 2/3 라인 콤보가 있는지 어떻게 알 수 있습니까? 소스 스탑과 일치하는 라인과 목적지 스탑을위한 라인을 검색하고 이들 사이에서 사용자가 버스를 전환 할 수있는 공통 스탑을 얻을 수 있는지 확인하려고했습니다. 그 기억을 어떻게 기억합니까?
  • 3 라인 콤보는 더 까다 롭습니다. 소스 라인과 목적지 라인을 찾으면 어떻게됩니까? 2 개의 정류장이있는 줄을 찾으십시오. 그러나 다시 한번, 정류장을 어떻게 기억합니까?

tl; dr

다시 사용하기 위해 쿼리 결과를 어떻게 기억합니까? 단일 쿼리 (각각 1 줄 경로에 대한 쿼리, 2에 대한 쿼리 및 3 줄 콤보에 대한 쿼리)로 이것을 달성하기를 희망합니다.

참고 : 누군가 내가 내가 가진 것과 완전히 다른 접근법을 제안하더라도 상관 없습니다 . 나는 어떤 해결책에도 열려 있습니다.

쿠키 및 공감 비에 대한 지원을 제공합니다. 미리 감사드립니다!



@ eggyal : 나는 노드 위로 거리가 없습니다. 또한 네트워크 내부에서의 이동이 제한적입니다 (즉, 특정 버스 노선 만 지점 A에서 지점 B로 이동). 여전히 나에게 유용합니까?
Madara의 유령

또한 단일 쿼리로 저장 프로 시저를 사용하는 것이 좋습니다. 단일 쿼리로 수행 할 수도있는 경우 가능합니다. 결과 / 변수를 쉽게 저장하고 재사용 할 수 있습니다.

1
@Truth mysqltutorial.org/stored-procedures-loop.aspx (loops), mysqltutorial.org/… (cases) -dijkstra 알고리즘과 같은 것을 사용하면 문제를 해결할 수 있어야합니다. 문제. 기본적으로, 그것은 PHP 함수처럼 -하지만 MySQL을

1
이미 스택 오버플로에있는 것 같습니다. 이 링크에는 현재 MySQL에는 없지만 여러 솔루션이 있습니다. (쉽게 요약되지 않은 몇 가지 답변이 있으며 링크 부패는 문제가되지 않습니다. 해당 사이트가 사라지면 아마도이 사이트도 멀어지기 때문에 많은 찬성 투표가 있습니다.)
psr

답변:


3

이 시점에서 과감한 변화를 원치 않을 수도 있지만 그래프 데이터베이스 의 유스 케이스는 정확히 설명하는 것 입니다. 그래프 데이터베이스 는 그래프 이론을 기반으로하며 버스 경로의 직접 그래프에서 'X'와 'Y'사이의 경로를 찾으려고합니다.

아직 살펴 보지 않았다면 Neo4J 와 같은 것을 들여다 보십시오 . REST API가 있으며 PHP 클라이언트 를 찾을 수 있습니다 .

구현 측면에서 도움을 줄 수있는 많은 사람들이 Stack Overflow 를 찾을 수 있습니다.


1
나는 현재 사고 단계에 있으며, 무엇이든 바꿀 수 있습니다. 나는 당신의 링크를 확인합니다. 또한이 질문은 Stack Overflow 에서 나왔습니다 . 구현에 도움이 될 것입니다 :)
Madara의 유령

1
재귀 쿼리를 제안하려고했지만 MySQL이 해당 쿼리를 지원하지 않으므로이 답변이 더 나을 수 있습니다.
FrustratedWithFormsDesigner

@FrustratedWithFormsDesigner SP와 인접 목록을 결합하는 매우 어색한 MySQL 솔루션이 있을지 모르지만, 생각할 때 가치가 있다고 생각하지 않습니다.
yannis 2016

@YannisRizos : 좋은 코드 골프 도전일지도 모릅니다. ;)
FrustratedWithFormsDesigner 2016

1
@FrustratedWithFormsDesigner Nah, 이것은 좋은 코드 골프 도전입니다
yannis

0

하자 사용자가에서 가고 싶은 말 $start_id$end_id(모두 유효한 stop_id 값입니다). 이 쿼리를 사용하여에서 $start_id까지 유효한 경로를 찾을 수 있습니다 $end_id.

  1. 직접 경로 검색 (한 줄) :

    SELECT *
    FROM bus_stops bs1, bus_stops bs2
    WHERE bs1.stop_id=$start_id AND bs2.stop_id=$end_id AND bs1.bus_line=bs2.bus_line
    
  2. 이전 쿼리에 대한 결과가 없으면 2 개의 리그를 사용하여 경로를 검색하십시오.

    SELECT *
    FROM bus_stops bs1, bus_stops bs2, bus_stops bs3, bus_stops bs4
    WHERE bs1.stop_id=$start_id
        AND bs1.bus_line=bs2.bus_line
    AND bs2.stop_id=bs3.stop_id
        AND bs3.bus_line=bs4.bus_line
    AND bs4.stop_id=$end_id
    

대체 *당신이 정말로 검색하는 데 필요한 필드.


조슬린 안녕하세요! Markdown을 최대한 활용하는 방법을 찾으려면 편집 도움말 페이지를 자세히 읽으십시오 . 이번에 답변을 수정 했습니다. 수정 내역 을 확인하여 내가 수정 한 내용을 확인할 수 있습니다 .
yannis 2016

같은 데이터베이스에서 4 번 연속 선택하는 이유는 무엇입니까?
Madara의 유령

경로를 완성하기 위해 하나 이상의 버스 노선 ( bus_stops bs5) 이 필요한 경우 어떻게됩니까 ?
FrustratedWithFormsDesigner
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.