Bagaimana cara sementara menyimpan hasil query, untuk digunakan di yang lain?

12

Saya memiliki masalah ini, saya pikir Anda dapat membantu saya.
PS Saya tidak yakin bagaimana menyebutnya, jadi jika ada yang menemukan judul yang lebih tepat, silakan lakukan edit.

Latar Belakang

  • Saya membuat aplikasi ini untuk mencari jalur transit bus.
  • Jalur bus adalah angka 3 digit, dan unik dan tidak akan pernah berubah.
  • Syaratnya adalah untuk dapat mencari baris dari halte A ke hal B.
  • Antarmuka pengguna sudah berhasil mengisyaratkan pengguna untuk hanya menggunakan nama berhenti yang valid.
  • Syaratnya adalah untuk dapat menampilkan jika rute memiliki jalur langsung, dan jika tidak, menampilkan kombinasi 2 baris dan bahkan 3 baris.

Contoh:

Saya perlu beralih dari titik A ke titik D. Program harus menunjukkan:

  • Jika ada AD jalur langsung.
  • Jika tidak, tampilkan alternatif, 2 garis kombo, seperti AC, CD.
  • Jika tidak ada kombo 2 garis, cari kombo 3 baris: AB, BC, CD.

Tentu saja, aplikasi harus menampilkan nomor jalur bus, serta kapan harus berganti bus.

Apa yang saya punya:

Basis data saya disusun sebagai berikut (disederhanakan, basis data aktual mencakup lokasi dan waktu dan yang lainnya):

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

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

Di mana lines_stops_relationshipmenggambarkan hubungan banyak-ke-banyak antara jalur bus dan halte.

Order, menandakan urutan pemberhentian yang muncul dalam satu baris. Tidak semua baris bolak-balik, dan urutan memiliki makna (titik A dengan urutan 2 datang setelah titik B dengan urutan 1).

Masalah

  • Kami mencari tahu apakah garis dapat melewati rute dengan cukup mudah. Cukup cari satu baris yang melewati kedua titik dalam urutan yang benar.
  • Bagaimana saya dapat menemukan jika ada kombo 2/3 baris? Saya berpikir untuk mencari jalur yang cocok dengan sumber berhenti, dan satu untuk tujuan berhenti, dan melihat apakah saya bisa mendapatkan perhentian umum di antara mereka, di mana pengguna dapat berganti bus. Bagaimana saya ingat berhenti itu?
  • 3 baris kombo bahkan lebih rumit, saya menemukan garis untuk sumber, dan garis untuk tujuan, lalu apa? Cari garis yang memiliki 2 stop, saya kira, tapi sekali lagi, Bagaimana saya ingat berhenti?

tl; dr

Bagaimana saya mengingat hasil dari kueri agar dapat menggunakannya lagi? Saya berharap untuk mencapai ini dalam satu permintaan (untuk masing-masing, permintaan untuk rute 1-line, permintaan untuk 2, dan permintaan untuk kombo 3-line).

Catatan: Saya tidak keberatan jika seseorang menyarankan pendekatan yang sama sekali berbeda dari yang saya miliki, saya terbuka untuk solusi apa pun.

Akan memberikan bantuan apa pun dengan cookie dan upvote. Terima kasih sebelumnya!

Hantu Madara
sumber
@eggyal: Saya tidak memiliki jarak di atas node. Juga, saya terbatas dalam pergerakan di dalam jaringan (yaitu hanya jalur bus tertentu yang bergerak dari titik A ke titik B). Apakah ini masih berguna bagi saya?
Hantu Madara
Saya juga menyarankan untuk menggunakan prosedur tersimpan atas satu permintaan untuk ini - jika mungkin untuk melakukannya dengan satu permintaan. Di sana Anda dapat dengan mudah menyimpan hasil / variabel dan menggunakannya kembali.
1
@ Truth Mungkin yang terbaik untuk memberi Anda beberapa kata: mysqltutorial.org/stored-procedures-loop.aspx (loop), mysqltutorial.org/… ( kasing ) - dikombinasikan dengan sesuatu seperti algoritma dijkstra, Anda harus dapat menyelesaikan masalah Anda masalah. Pada dasarnya, ini seperti fungsi php - tetapi pada mysql
1
Tampaknya sudah berada di Stack Overflow - tautan ini memiliki beberapa solusi meskipun tidak ada di MySQL saat ini. (Ada beberapa jawaban yang tidak meringkas dengan mudah dan tautan yang busuk mungkin tidak menjadi masalah karena jika situs itu hilang juga mungkin. Plus ia memiliki banyak upvotes).
psr

Jawaban:

3

Anda mungkin tidak ingin membuat perubahan drastis pada titik ini, tetapi apa yang Anda jelaskan adalah kasus penggunaan untuk Graph Database . Database Grafik didasarkan pada teori grafik, yang merupakan apa yang Anda sentuh dengan mencoba menemukan jalur antara 'X' dan 'Y' di seluruh grafik rute bus yang diarahkan.

Jika Anda belum melihatnya, intip sesuatu seperti Neo4J . Ini memiliki API REST dan Anda dapat menemukan klien PHP untuk itu.

Anda akan menemukan sekelompok orang dari Stack Overflow yang dapat membantu dengan sisi implementasi dari berbagai hal.

Dan McGrath
sumber
1
Saya saat ini pada tahap berpikir, saya dapat mengubah apa pun. Saya akan memeriksa tautan Anda. Juga, pertanyaan ini datang dari Stack Overflow , saya tahu mereka dapat membantu saya mengimplementasikannya :)
Madara's Ghost
1
Saya akan menyarankan pertanyaan rekursif, tetapi tampaknya MySQL tidak mendukungnya sehingga jawaban ini mungkin lebih baik.
FrustratedWithFormsDesigner
@FrustratedWithFormsDesigner Mungkin ada solusi MySQL yang sangat canggung yang akan menggabungkan SP dan daftar adjacency, tapi saya pikir itu bahkan tidak sepadan dengan waktu untuk memikirkannya.
yannis
@YannisRizos: Ini mungkin tantangan kode golf yang bagus, mungkin? ;)
FrustratedWithFormsDesigner
1
@FrustratedWithFormsDesigner Nah, ini adalah tantangan kode golf yang bagus
yannis
0

Katakanlah pengguna ingin beralih dari $start_idke $end_id(keduanya adalah nilai stop_id yang valid). Anda dapat menggunakan kueri ini untuk menemukan rute yang valid dari $start_idke $end_id:

  1. Cari rute langsung (jalur tunggal):

    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. Jika tidak ada hasil dengan permintaan sebelumnya, maka cari rute menggunakan 2 lignes:

    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

Ganti *dengan bidang yang benar-benar perlu Anda ambil.

Jocelyn
sumber
Halo Jocelyn dan selamat datang! Silakan baca halaman bantuan pengeditan kami secara menyeluruh untuk mengetahui bagaimana Anda dapat memaksimalkan Markdown. Saya telah mengedit jawaban Anda kali ini, Anda dapat memeriksa riwayat revisinya untuk melihat hasil edit yang saya buat.
yannis
Mengapa Anda memilih dari database yang sama 4 kali berturut-turut?
Hantu Madara
Dan apa yang terjadi jika Anda membutuhkan satu jalur bus lagi ( bus_stops bs5) untuk menyelesaikan rute?
FrustratedWithFormsDesigner