2014-03-04 49 views
1

我试图找出某些东西,但它不是很好。 我有两个表的数据库。从mysql中检索值,如果它不存在于其他表

表1:用户 表2:投票

表1具有:用户ID 表2具有:votemyid和votevotedid

第二个是相同的用户ID,我怎样才能确保它如果表中的votevotedid值存在,则不会从用户中选择值?

我的SQL代码到目前为止是:

$result = mysql_query("SELECT *, (6371 * acos(cos(radians($lat)) * cos(radians(lat)) * cos(radians(lng) - radians($lng)) + sin(radians($lat)) * sin(radians(lat)))) AS distance count(*) FROM users,voted WHERE voted.votevotedid not in (select users.userid from users) HAVING distance < $distance ORDER BY RAND() LIMIT 1"); 

我能做到这一点,然后做了投票数据库的第二个请求mysql_query,但得到的要多

+1

您从两个表中选择而未指定连接条件。你会得到两个表的笛卡尔积。例如1000条记录和2000条记录= 2,000,000条加入产品。 –

+0

你应该更好地解释你需要什么。也许提供一个例子。 –

+0

嗯,我有两个表,一个用户和一个用户在其他人投票,它只需要选择该用户没有投票的用户:$ result = mysql_query(“SELECT *,(6371 * acos(cos (弧度($ lat))* cos(弧度(lat))* cos(弧度(lng) - 弧度($ lng))+ sin(弧度($ lat))* sin(弧度(lat))))AS距离count(*)FROM users,vote WHERE voted.votevotedid not in(select users.userid from users)HAVING distance <$ distance ORDER BY RAND()LIMIT 1“);但如果我这样做,我不能过滤myid –

回答

0

尝试添加以下内容:

WHERE userid NOT IN (SELECT DISTINCT(votevoteid) FROM voted) 
AND votevoteid=userid 
+0

给我一个内部服务器错误 –

+0

什么是你现在完整的SQL代码?另外,你使用的是什么类型的SQL-Server?也许MySQL不支持NOT IN,我经常在MSSQL中使用它。 –

+0

不好意思我用mysql确实 –

0

我尝试解释一下,我有两个数据库表,其中一个用户返回一个用户ID和GPS位置。

有一张表决票,那些人已经投票。 我的基本查询工作正常,但它不断返回我已投票的人。

所以它需要做的是检查投票表格,为我的投票,看看被选中的人是否已经存在与我的id的投票表中,如果是这种情况,它会跳过它。

原始查询:

$result = mysql_query("SELECT *, (6371 * acos(cos(radians($lat)) * cos(radians(lat)) * cos(radians(lng) - radians($lng)) + sin(radians($lat)) * sin(radians(lat)))) AS distance count(*) FROM users HAVING distance < $distance ORDER BY RAND() LIMIT 1"); 

更改为:

$result = mysql_query("SELECT *, (6371 * acos(cos(radians($lat)) * cos(radians(lat)) * cos(radians(lng) - radians($lng)) + sin(radians($lat)) * sin(radians(lat)))) AS distance count(*) FROM users,voted WHERE userid NOT IN (SELECT DISTINCT(votevoteid) FROM voted WHERE votemyid = '$me') AND votevoteid=userid HAVING distance < $distance ORDER BY RAND() LIMIT 1"); 

给了我一个内部服务器错误

1

的方法是使用LEFT JOIN:

SELECT u.userid 
FROM Users AS u 
LEFT JOIN Voted AS v ON u.userid = v.votevotedid 
WHERE v.votemyid IS NULL 

什么LEFT JOIN确实返回所有用户记录并与投票表匹配,并排除投票表返回匹配记录的记录(通过使用v.votemyid IS NULL)

我不确定你的SQL没有看到确切的表结构,但它应该是类似的东西跟随LEFT JOIN。

$result = mysql_query("SELECT u.*, (6371 * acos(cos(radians($lat)) * cos(radians(lat)) * cos(radians(lng) - radians($lng)) + sin(radians($lat)) * sin(radians(lat)))) AS distance 
FROM users AS u 
LEFT JOIN voted AS v ON users.userid = v.votevotedid 
WHERE v.votemyid IS NULL 
HAVING u.distance < $distance 
ORDER BY RAND() 
LIMIT 1"); 
+0

谢谢,但由于某种原因,这仍然给我一个内部服务器错误 –

+0

我试了一下:'on子句'中的未知列'users.userid'何时我开始删除东西:'having clause'中的未知列'u.distance',并且我不断收到错误。 –

+0

使用原始脚本smozgur发布,但用u.userid替换users.userid –

0
select * from users where userid not in (select votevotedid from votevotedid) 
0

这似乎是工作

$result = mysql_query("SELECT *, (6371 * acos(cos(radians($lat)) * cos(radians(lat)) * cos(radians(lng) - radians($lng)) + sin(radians($lat)) * sin(radians(lat)))) AS distance FROM users AS u LEFT JOIN voted AS v ON u.userid = v.votevotedid WHERE v.votemyid != '1' HAVING distance < $distance ORDER BY RAND() LIMIT 1"); 

当我改变了“votemyid”到2号(即用户id 2投票用户ID 1),它显示了对我来说(如用户ID 1)

没关系,不起作用。

如果没有人在投票表中它也不会返回任何

当我加入:

WHERE v.votemyid IS NULL 

而且还有其他人在桌子上,让我们说:用户ID 1投票userid1,i(id 1)获得o结果返回

相关问题