จะบันทึกผลลัพธ์ของแบบสอบถามชั่วคราวเพื่อใช้ในรายการอื่นได้อย่างไร


12

ฉันมีปัญหานี้ฉันคิดว่าคุณอาจช่วยฉันได้
ป.ล. ฉันไม่แน่ใจว่าจะเรียกสิ่งนี้อย่างไรดังนั้นหากใครพบชื่อที่เหมาะสมกว่านี้โปรดแก้ไข

พื้นหลัง

  • ฉันกำลังสร้างแอปพลิเคชันนี้สำหรับการค้นหาเส้นทางขนส่งรถบัส
  • สายรถเมล์เป็นตัวเลข 3 หลักและไม่ซ้ำใครและจะไม่เปลี่ยนแปลง
  • ความต้องการคือสามารถค้นหาบรรทัดจาก stop A ถึง stop B
  • ส่วนต่อประสานกับผู้ใช้ประสบความสำเร็จในการบอกเป็นนัยให้ผู้ใช้ใช้ชื่อหยุดที่ถูกต้องเท่านั้น
  • ความต้องการจะสามารถแสดงได้หากเส้นทางมีเส้นตรงและหากไม่มีให้แสดงการรวมกันแบบ 2 บรรทัดและ 3 บรรทัด

ตัวอย่าง:

ฉันต้องได้รับจากจุด A ถึงจุด D โปรแกรมควรแสดง:

  • หากมีโฆษณาสายตรง
  • ถ้าไม่ให้แสดงทางเลือกคอมโบ 2 บรรทัดเช่น AC, CD
  • หากไม่มีคอมโบสองบรรทัดให้ค้นหาคอมโบ 3 บรรทัด: AB, BC, CD

แน่นอนว่าแอพควรแสดงหมายเลขสายรถประจำทางรวมถึงเวลาที่จะเปลี่ยนรถโดยสาร

สิ่งที่ฉันมี:

ฐานข้อมูลของฉันมีโครงสร้างดังนี้ (ฐานข้อมูลจริงที่เรียบง่ายประกอบด้วยตำแหน่งและเวลาและอะไร):

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

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

ไหนlines_stops_relationshipอธิบายความสัมพันธ์ที่หลายต่อหลายคนระหว่างสายรถประจำทางและหยุด

คำสั่งหมายถึงคำสั่งที่หยุดปรากฏในบรรทัดเดียว ไม่ใช่ทุกบรรทัดที่กลับไปกลับมาและคำสั่งซื้อมีความหมาย (จุด A ที่มีคำสั่ง 2 มาหลังจากจุด B พร้อมคำสั่งที่ 1)

ปัญหา

  • เราพบว่าสายสามารถผ่านเส้นทางได้อย่างง่ายดายเพียงพอหรือไม่ เพียงค้นหาบรรทัดเดียวที่ผ่านจุดทั้งสองในลำดับที่ถูกต้อง
  • ฉันจะค้นหาได้อย่างไรว่ามีคำสั่งผสม 2/3 บรรทัด ฉันกำลังคิดที่จะค้นหาบรรทัดที่ตรงกับการหยุดต้นทางและอีกอันสำหรับการหยุดปลายทางและดูว่าฉันจะได้รับการหยุดทั่วไประหว่างพวกเขาหรือไม่ซึ่งผู้ใช้สามารถเปลี่ยนรถโดยสารได้ ฉันจะจำที่หยุดได้อย่างไร
  • คำสั่งผสม 3 บรรทัดนั้นยิ่งมีความซับซ้อนยิ่งขึ้นฉันหาบรรทัดของแหล่งที่มาและเส้นสำหรับปลายทางแล้วอะไรล่ะ ค้นหาบรรทัดที่มี 2 หยุดฉันเดา แต่อีกครั้งฉันจะจำหยุดได้อย่างไร

TL; DR

ฉันจะจำผลลัพธ์จากแบบสอบถามเพื่อให้สามารถใช้อีกครั้งได้อย่างไร ฉันหวังว่าจะบรรลุผลในแบบสอบถามเดียว (สำหรับแต่ละคำค้นหาเส้นทาง 1 บรรทัดแบบสอบถาม 2 และแบบสอบถามคอมโบ 3 บรรทัด)

หมายเหตุ:ฉันไม่รังเกียจหากมีคนแนะนำวิธีการที่แตกต่างอย่างสิ้นเชิงจากที่ฉันมีฉันเปิดรับวิธีการแก้ปัญหาใด ๆ

จะให้รางวัลความช่วยเหลือใด ๆ กับคุกกี้และอัปโหลด ขอบคุณล่วงหน้า!



@eggyal: ฉันไม่มีระยะทางเหนือโหนด นอกจากนี้ฉันมีข้อ จำกัด ในการเคลื่อนไหวภายในเครือข่าย (เช่นรถบัสบางสายเท่านั้นที่ย้ายจากจุด A ไปยังจุด B) มันยังมีประโยชน์สำหรับฉันหรือไม่
ผีของมาดาราระ

ฉันขอแนะนำให้ใช้กระบวนงานที่เก็บไว้ในแบบสอบถามเดียวสำหรับกรณีนี้ - ถ้าเป็นไปได้ที่จะทำด้วยแบบสอบถามเดียว คุณสามารถเก็บผลลัพธ์ / ตัวแปรและนำมาใช้ใหม่ได้อย่างง่ายดาย

1
@ ความจริงน่าจะดีที่สุดที่จะให้คุณ tuts: mysqltutorial.org/stored-procedures-loop.aspx (ลูป), mysqltutorial.org/ (กรณี) - รวมกับบางสิ่งบางอย่างเช่นอัลกอริทึม dijkstra คุณควรจะสามารถแก้ปัญหาของคุณ ปัญหา. โดยทั่วไปมันเป็นฟังก์ชั่น PHP - แต่ใน mysql

1
ดูเหมือนว่าจะอยู่ใน Stack Overflowลิงก์นี้มีวิธีแก้ไขปัญหาหลายอย่าง แต่ไม่มีใน MySQL ในขณะนี้ (มีคำตอบหลายข้อที่ไม่สามารถสรุปได้ง่ายและการเชื่อมโยงเน่าอาจไม่เป็นปัญหาเพราะถ้าเว็บไซต์นั้นหายไปคนนี้ก็อาจทำได้เช่นกัน
psr

คำตอบ:


3

คุณอาจไม่ต้องการที่จะทำให้ความรุนแรงของการเปลี่ยนแปลงที่จุดนี้นี้ แต่สิ่งที่คุณอธิบายว่าเป็นกรณีที่ใช้สำหรับฐานข้อมูลกราฟ ฐานข้อมูลกราฟอยู่บนพื้นฐานของทฤษฎีกราฟซึ่งเป็นสิ่งที่คุณสัมผัสโดยพยายามหาเส้นทางระหว่าง 'X' และ 'Y' ในกราฟของเส้นทางรถเมล์

หากคุณยังไม่ได้ดูแล้วเป็นหนึ่งจะมองที่สิ่งที่ต้องการNeo4j มี REST API และคุณสามารถค้นหาไคลเอนต์ PHPได้

คุณจะพบกับกลุ่มคนของStack Overflowที่สามารถช่วยเหลือด้านการดำเนินการของสิ่งต่าง ๆ


1
ตอนนี้ฉันอยู่ในช่วงการคิดฉันสามารถเปลี่ยนแปลงอะไรก็ได้ ฉันจะตรวจสอบลิงก์ของคุณ นอกจากนี้ยังมีคำถามนี้มาจากกองมากเกินฉันรู้ว่าพวกเขาสามารถช่วยให้ฉันใช้มัน :)
มาดาระผี

1
ฉันจะแนะนำการค้นหาแบบเรียกซ้ำ แต่ดูเหมือนว่า MySQL จะไม่สนับสนุนสิ่งเหล่านั้นดังนั้นคำตอบนี้อาจจะดีกว่า
FrustratedWithFormsDesigner

@FrustratedWithFormsDesigner อาจมีโซลูชัน MySQL ที่น่าอึดอัดใจมากที่จะรวม SP และรายการ adjacency แต่ฉันไม่คิดว่ามันคุ้มค่ากับเวลาที่คิด
yannis

@ YannisRizos: มันอาจจะเป็นความท้าทายที่ดีสำหรับการเล่นกอล์ฟ ;)
FrustratedWithFormsDesigner


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 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
    

แทนที่*ด้วยฟิลด์ที่คุณต้องการเรียกคืน


สวัสดีโจเซลีนและยินดีต้อนรับ! โปรดอ่านหน้าความช่วยเหลือการแก้ไขของเราอย่างละเอียดเพื่อดูว่าคุณจะได้ประโยชน์สูงสุดจาก Markdown ได้อย่างไร ฉันได้แก้ไขคำตอบของคุณในครั้งนี้คุณสามารถตรวจสอบประวัติการแก้ไขเพื่อดูว่าฉันได้แก้ไขอะไร
yannis

ทำไมคุณถึงเลือกจากฐานข้อมูลเดียวกัน 4 ครั้งติดต่อกัน
ผีของมาดาราระ

และจะเกิดอะไรขึ้นหากคุณต้องการรถบัสสายอื่น ( ) อีกหนึ่งเส้นbus_stops bs5เพื่อให้เส้นทางเสร็จสมบูรณ์
FrustratedWithFormsDesigner
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.