SQL语句问题求助:ON子句中Plant.id=1条件未被识别
看起来你遇到的问题主要有两个点,咱们一步步来解决:
首先,你的SQL里ON (Plant.greenhouse=greenhouse.id AND Plant.id = 1)这里的greenhouse.id有歧义——你的查询语句里根本没有引入名为greenhouse的表,数据库不知道这个greenhouse指的是哪个表的字段。我猜你应该是想关联Censor_Data_Greenhouse表中的某个和温室相关的字段?比如假设Censor_Data_Greenhouse有个greenhouse字段对应Plant.greenhouse,那得把这个字段的表来源明确写出来。
然后是你说的Plant.id = 1条件没被识别的问题——其实这个条件是生效的,但因为你用的是LEFT JOIN,它的作用是只匹配Plant表中id=1且满足关联条件的行,如果没有匹配到,主表(Censor_Data_Greenhouse)的记录还是会被保留,只是Plant相关的字段会是NULL。如果你误以为没生效,可能是因为你想过滤掉那些没有匹配到Plant.id=1的记录,这时候就需要调整条件的位置了。
给你几个修正后的版本参考:
版本1:修正表歧义,保留LEFT JOIN原逻辑
这个版本会返回所有Censor_Data_Greenhouse的记录,只有匹配到Plant.id=1的行才会带上Plant的信息,否则Plant字段为NULL:
SELECT cdg.value AS gVal, cdg.time_date AS gClock, dtg.name AS gDatatype FROM Censor_Data_Greenhouse cdg JOIN Data_Type_Greenhouse dtg ON cdg.data_type = dtg.id LEFT JOIN Plant p ON p.greenhouse = cdg.greenhouse AND p.id = 1 ORDER BY gClock DESC
我给表加了别名(cdg、dtg、p),这样SQL更简洁,也避免了字段歧义。
版本2:只返回关联到Plant.id=1的记录(用INNER JOIN)
如果你只想保留那些确实和Plant.id=1关联的记录,把LEFT JOIN改成INNER JOIN就行:
SELECT cdg.value AS gVal, cdg.time_date AS gClock, dtg.name AS gDatatype FROM Censor_Data_Greenhouse cdg JOIN Data_Type_Greenhouse dtg ON cdg.data_type = dtg.id INNER JOIN Plant p ON p.greenhouse = cdg.greenhouse AND p.id = 1 ORDER BY gClock DESC
版本3:保留LEFT JOIN但过滤无匹配的记录
或者你也可以保留LEFT JOIN,把p.id = 1放到WHERE子句里,效果和上面的INNER JOIN一样:
SELECT cdg.value AS gVal, cdg.time_date AS gClock, dtg.name AS gDatatype FROM Censor_Data_Greenhouse cdg JOIN Data_Type_Greenhouse dtg ON cdg.data_type = dtg.id LEFT JOIN Plant p ON p.greenhouse = cdg.greenhouse WHERE p.id = 1 ORDER BY gClock DESC
先检查一下你的表结构,确认Censor_Data_Greenhouse里对应的温室字段是不是greenhouse,如果不是,替换成实际的字段名就行。
内容的提问来源于stack exchange,提问作者VorteXx3

