Sorgunun sonucunu geçici olarak nasıl kaydedebilirim, başka bir yerde kullanabilirsiniz?


12

Bana bu konuda yardımcı olabileceğini düşünüyorum.
Not: Bunu nasıl arayacağınızdan emin değilim, bu yüzden daha uygun bir başlık bulursa, lütfen düzenleme yapın.

Arka fon

  • Otobüs transit hatları aramak için bu uygulamayı yapıyorum.
  • Otobüs hatları 3 haneli bir sayıdır ve benzersizdir ve asla değişmez.
  • Gereksinim, A durağından B durağına kadar olan hatları arayabilmektir.
  • Kullanıcı arabirimi, kullanıcıyı yalnızca geçerli durma adlarını kullanması için yönlendirmede zaten başarılı.
  • Gereksinim, bir rotada doğrudan bir çizgi olup olmadığını görüntüleyebilmeli ve eğer değilse, 2 satırlı ve hatta 3 satırlı bir kombinasyon gösterebilmeli.

Misal:

A noktasından D noktasına gitmem gerekiyor. Program şunu göstermelidir:

  • Doğrudan bir hat AD varsa.
  • Değilse, alternatif, AC, CD gibi 2 satır kombinasyonlarını görüntüleyin.
  • Herhangi bir 2 satırlı kombinasyon yoksa, 3 satırlı kombinasyonları arayın: AB, BC, CD.

Tabii ki, uygulama otobüs hattı numaralarını ve ne zaman otobüs değiştirileceğini göstermelidir.

Neyim var:

Veritabanım aşağıdaki gibi yapılandırılmıştır (basitleştirilmiş, gerçek veritabanı konumları ve saatleri içerir ve ne olursa olsun):

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

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

Burada lines_stops_relationshipotobüs hatları ve duraklar arasındaki çoktan çoğa bir ilişki açıklanmaktadır.

Sıra, durakların tek bir satırda görünme sırasını belirtir. Tüm satırlar ileri geri gitmez ve düzenin anlamı vardır (2 numaralı siparişle A noktası, sipariş 1 ile B noktasından sonra gelir).

Sorun

  • Bir hattın rotadan yeterince kolay geçip geçemeyeceğini öğreniyoruz. Her iki noktadan doğru sırayla geçen tek bir satır arayın.
  • 2/3 satırlık birleşik giriş olup olmadığını nasıl bulabilirim? Kaynak durağı ve bir hedef durağı ile eşleşen bir çizgi aramayı ve aralarında ortak bir durağı alıp alamayacağımı, kullanıcının otobüsleri değiştirebileceğini görmeyi düşünüyordum. Bu durağı nasıl hatırlarım?
  • 3 satır açılan bile daha zor, ben kaynak için bir çizgi ve hedef için bir çizgi bulmak, ve sonra ne? Sanırım 2 durağı olan bir satır ara, ama yine, durakları nasıl hatırlıyorum?

tl; Dr.

Bir sorgunun sonuçlarını tekrar kullanabilmek için nasıl hatırlarım? Ben tek bir sorguda (her biri için 1 satır rotaları için bir sorgu, 2 için bir sorgu ve 3 satır kombinasyonları için bir sorgu) elde etmeyi umuyorum.

Not: Birisi sahip olduğumdan tamamen farklı bir yaklaşım önerirse umursamıyorum, herhangi bir çözüme açığım.

Bir çerez ve bir oylama ile herhangi bir yardım verir. Şimdiden teşekkürler!



@eggyal: Düğümler üzerinde mesafem yok. Ayrıca, ağın içindeki hareketle sınırlıyım (yani sadece belirli otobüs hatları A noktasından B noktasına hareket eder). Hala benim için faydalı mı?
Madara'nın Hayaleti

Ayrıca tek bir sorgu ile yapmak bile mümkün - bu tek bir sorgu üzerinde saklı bir yordam kullanmanızı öneririm. Burada sonuçları / değişkenleri kolayca saklayabilir ve yeniden kullanabilirsiniz.

1
@Truth Muhtemelen size biraz tuts vermek en iyisidir: mysqltutorial.org/stored-procedures-loop.aspx (döngüler), mysqltutorial.org/… (durumlar) - dijkstra algoritması gibi bir şeyle birlikte, sorun. Temel olarak, bu bir php işlevi gibi - ama mysql üzerinde

1
Stack Overflow'da zaten var gibi görünüyor - şu anda hiçbiri MySQL'de olmasa da bu bağlantının birden fazla çözümü var. (Kolayca özetlemeyen ve bağlantı çürümesi muhtemelen bir sorun değildir, çünkü bu site ortadan kaybolursa bu muhtemelen de yapar. Artı çok sayıda oy içerir).
psr

Yanıtlar:


3

Bu noktada bir değişikliğin bu şiddetini yapmak istemeyebilirsiniz, ancak açıkladığınız şey tam olarak Grafik Veritabanları için kullanım durumudur . Grafik Veritabanları , otobüs güzergahlarının yönlendirilmiş bir grafiğinde 'X' ve 'Y' arasında bir yol bulmaya çalıştığınız grafik teorisine dayanır.

Henüz bir tanesine bakmadıysanız, Neo4J gibi bir şeye göz atın . Bir REST API'sine sahiptir ve bunun için PHP istemcileri bulabilirsiniz .

Bir sürü Stack Overflow işinin uygulama tarafında yardımcı olabilecek insanlar bulacaksınız .


1
Şu anda düşünme aşamasındayım, her şeyi değiştirebilirim. Bağlantılarınızı kontrol edeceğim. Ayrıca, bu soru Stack Overflow'dan geldi , bunu uygulamama yardımcı olabilirler :)
Madara'nın Hayaleti

1
Özyinelemeli sorgular önerecektim, ancak bu cevap daha iyi olabilir, bu yüzden MySQL bunları desteklemiyor gibi görünüyor.
SinirliWithFormsDesigner

@FrustratedWithFormsDesigner SP ve bir bitişiklik listesini birleştirecek çok garip bir MySQL çözümü olabilir, ancak bunu düşünmeye bile değdiğini sanmıyorum.
yannis

@YannisRizos: İyi bir kod golf zorluğu olabilir, belki? ;)
FrustratedWithFormsDesigner

1
@FrustratedWithFormsDesigner Nah, bu iyi bir kod golf mücadelesi
yannis

0

Diyelim bir kullanıcı gitmek istediği söylemek $start_idiçin $end_id(her ikisi de geçerli stop_id değerlerdir). Sen arasında geçerli bir rota bulmak için bu sorguları kullanabilir $start_idiçin $end_id:

  1. Doğrudan rota arayın (tek hat):

    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. Önceki sorguda sonuç yoksa, 2 lign kullanarak bir rota arayın:

    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

*Gerçekten almanız gereken alanlarla değiştirin .


Merhaba Jocelyn ve hoş geldiniz! Markdown'dan en iyi şekilde nasıl yararlanabileceğinizi öğrenmek için lütfen düzenleme yardım sayfamızı iyice okuyun . Cevabınızı bu kez düzenledim, hangi düzenlemeleri yaptığımı görmek için düzeltme geçmişini kontrol edebilirsiniz .
yannis

Neden aynı veritabanından arka arkaya 4 kez seçiyorsunuz?
Madara'nın Hayaleti

Rotayı tamamlamak için bir otobüs hattına ( ) daha ihtiyacınız varsa ne olur bus_stops bs5?
FrustratedWithFormsDesigner
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.