Mysql

使用內部連接獲取 MySQL 選擇的正確語法

  • July 13, 2016

使用 MySQL 版本 5.1.73 和 phpmyadmin 4.0.10.16。

我無法通過語法檢查器:

select * from courses as co , course_type as ct 
left join course_leaders as cl on cl.course_leaders_id = co.course_leaders_id1
left join course_links_to_innstyle as cli on cli.course_links_to_innstyle_id = co.course_links_to_innstyle_id 
where co.course_type_id = ct.course_type_id
order by short,start_date ASC

它堅持認為確實沒有列“co.course_leaders_id1”。

有什麼想法嗎?

好的,這就是我想出的結果(在下面的幫助下 - 謝謝)

select * from courses as co
left join course_leaders as cl on cl.course_leaders_id = co.course_leaders_id1
left join course_links_to_innstyle as cli on cli.course_links_to_innstyle_id = co.course_links_to_innstyle_id 
inner join course_type as ct on co.course_type_id = ct.course_type_id
order by short,start_date ASC

是的,問題之一是您將顯式 (SQL-92)JOIN語法與隱式連接,(SQL-89) 逗號語法混合在一起。雖然這是允許的,並且稍加註意它甚至可以正常工作,但很容易出現這種類型的錯誤。

您的FROM查詢部分:

from courses as co , course_type as ct 
left join course_leaders as cl 
   on cl.course_leaders_id = co.course_leaders_id1
left join course_links_to_innstyle as cli 
   on cli.course_links_to_innstyle_id = co.course_links_to_innstyle_id 

被解析為:

from 
   courses as co 
 ,                        -- <-- that acts as a CROSS JOIN
   (
       (
           course_type as ct 
       left join 
           course_leaders as cl 
       on 
           cl.course_leaders_id = co.course_leaders_id1
       )
   left join 
       course_links_to_innstyle as cli 
   on 
       cli.course_links_to_innstyle_id = co.course_links_to_innstyle_id 
   )

現在很清楚,括號裡面的,co是沒有定義的。


問題二是 沒有加入條件ct。您有 4 個表,但只有 2 個(而不是 3 個)加入條件。這要麼是您錯過的事情,要麼是查詢的目的是執行CROSS JOIN.


解決方案

  • 最好在JOIN任何地方都使用顯式語法,而不是將兩者(語法)混合。
  • 通過添加缺少的條件或使用CROSS JOIN如果這是查詢的意圖來修復程式碼。

引用自:https://dba.stackexchange.com/questions/143706