2010-03-01 37 views
2

林试图让这个查询工作,但我得到这个错误:“having子句”在 未知列“zips.city”MySQL的PHP​​查询HAVING子句

 
`$query = "SELECT 
    zips.* 
    FROM 
    zips 
    HAVING 
    zips.city LIKE '%$city%' 
    AND 
    zips.stateabbr LIKE '%$state%' 
    LIMIT 1"; 
$result = mysql_query($query) or die (mysql_error());` 

我的拉链表有一个城市列,所以林不知道是什么问题,我知道即时访问数据库,因为我没有任何错误运行此查询:

 
$zip1query = "SELECT 
     zips.* 
     FROM 
     zips 
     WHERE 
     zips.zip = '$zip'    
     "; 

任何建议,将不胜感激!谢谢!

+1

如果您使用HAVING,则还需要GROUP BY。 – Layke 2010-03-01 22:05:20

+0

是的,但这只会使查询变得不必要的复杂。为什么在一个简单的WHERE中可以同时使用? – 2010-03-01 22:06:33

+0

@Justin:虽然我们不太清楚Pete想要什么。 – 2010-03-01 22:07:29

回答

6

having条款并不意味着同样的事情where条款:运行一个简单的查询时,你应该使用where - 这是你在第二个查询中所做的工作。

having用于条件必须应用于group by子句的结果。


这意味着,在这里,您的查询应该是建立这样:

$query = "SELECT zips.* 
    FROM zips 
    where zips.city LIKE '%$city%' 
     AND zips.stateabbr LIKE '%$state%' 
    LIMIT 1"; 


有了,如果你仍然对不存在的或者未找到列错误(至少对于city和/或stateabbr,这将是因为该列不存在于您的表中。

在这种情况下,我们可以做的事情不多:您必须检查表的结构,以确定它包含哪些列。

可以使用一个基于网络的工具,像phpMyAdmin,或使用SQL指令诸如检查结构:

desc zips; 


作为参考,引用MySQL's manual page for select

The SQL standard requires that HAVING must reference only columns in the GROUP BY clause or columns used in aggregate functions.
...

Do not use HAVING for items that should be in the WHERE clause.
For example, do not write the following:

SELECT col_name FROM tbl_name HAVING col_name > 0; 

Write this instead:

SELECT col_name FROM tbl_name WHERE col_name > 0; 

...
The HAVING clause can refer to aggregate functions, which the WHERE clause cannot

+0

很好的答案,谢谢 – 2011-07-21 16:39:29

1

尝试使用WHERE而不是HAVING

+0

谢谢你的帮助我得到这个错误:未知列'zips.city'in'子句', – 2010-03-01 22:07:10

1

正确的做法是使用WHERE子句。

$query = "SELECT 
zips.* 
FROM 
zips 
WHERE 
zips.city LIKE '%$city%' 
AND 
zips.stateabbr LIKE '%$state%' 
LIMIT 1"; 

HAVING是当你分组,看到here一个解释使用

0

ö哎呀对不起,我发现了这个问题,显然我在城市之前放了一个空间,当时我在桌子上命名了这些列。所以我重新命名了这个专栏,并且无论如何谢谢你!但使用where函数而不是必须加快事情,谢谢你们!