mysql查询的不稳定行为

时间:2014-07-10 16:37:25

标签: mysql

我有以下查询:

 SELECT days.from, days.to, days.nombre, days.totalDays, days.bloque, 
        days.comentario, days.local, admin.eMail, admin.passcode, days.id, 
        admin.username
 FROM days,admin
 WHERE days.id='9' AND days.nombre=admin.username

问题是查询有些工作但有时不起作用。有时只使用某些ID。有没有其他方法来制定查询?

2 个答案:

答案 0 :(得分:1)

您当前正在使用隐式联接。 Explicit joins更易于阅读和理解,并且可以提供更一致的查询。

您可以使用JOIN重写您的查询。所以,而不是:

SELECT days.from, days.to, days.nombre, days.totalDays, days.bloque, 
       days.comentario , days.local, admin.eMail, admin.passcode, 
       days.id, admin.username 
FROM days,admin  
WHERE days.id='9' 
AND days.nombre=admin.username

您可以使用:

SELECT days.from,days.to,days.nombre,days.totalDays,days.bloque,
       days.comentario,days.local,admin.eMail,admin.passcode,
       days.id,admin.username
FROM days
INNER JOIN admin ON days.nombre=admin.username
WHERE days.id='9'

您可能已经注意到了解这里发生的事情有多容易。虽然这本身不应该修复您的查询,但它更容易阅读并因此更容易调试。

如果您发现某些情况不起作用,找出原因的最佳方法是删除一些限制并查看它是否有效。在这种情况下,请确保未显示的用户名的列days.id等于9.使用自然键时的其他潜在问题是额外的空格。如果JOIN属性days.nombre=admin.username可能失败,请检查此情况。

你的另一个选择,如果事实上,空格导致你的问题,就是取消你的自然键并实现代理键。代理键意味着您将使用标准且唯一的密钥代码,如int,随着时间的推移递增。您可以使用days.nombre作为外键,而不是将days.admin_id作为外键。

作为一项规则,尽管自然键有许多优点,而且这是一场激烈的争论,但人们普遍认为自然键只有在键是一致且独特的情况下才有效。

答案 1 :(得分:0)

只是猜测,但这里最近给我带来了一些问题:检查你的表和列定义字符集是否一致。看起来你有英语和西班牙语的混合,所以也许像ñ这样的非ASCII字符不符合预期。