【问题标题】:PHP MYSQL Join Query. SELECT WHERE AND IN OR Logic ErrorPHP MYSQL 连接查询。 SELECT WHERE AND IN OR 逻辑错误
【发布时间】:2011-07-07 20:33:41
【问题描述】:

大家好。我认为我的 qry 中有逻辑错误。输出是正确的,但是是三元组。我已经盯着这个很久了,没有看到它。有人可以对此有所了解吗?谢谢!!

也想添加此信息。

  • $userid = 1
  • $UserIDAList = (1,1,6)
  • $UserIDBList = (2,3,1)

PHP-代码:

$result  = mysql_query("SELECT TBL_ContactsList.ContactID, TBL_ContactName.FirstName FROM TBL_ContactsList, TBL_ContactName WHERE ((TBL_ContactName.NameID != $userid) AND (TBL_ContactsList.ContactID != $userid)) AND ((TBL_ContactName.NameID IN ($UserIDAList) OR TBL_ContactName.NameID IN $UserIDBList)))");

while ($row = mysql_fetch_array($result, MYSQL_NUM)) {
    printf ("ID: %s  Name: %s", $row[0], $row[1]);
    echo "<br/>";
}

只有 SQL 查询(可读性):

SELECT TBL_ContactsList.ContactID, TBL_ContactName.FirstName 
FROM TBL_ContactsList, TBL_ContactName 
WHERE ((TBL_ContactName.NameID != $userid) AND (TBL_ContactsList.ContactID != $userid)) 
AND ((TBL_ContactName.NameID IN ($UserIDAList) OR TBL_ContactName.NameID IN $UserIDBList)))

输出:

ID: 2 Name: Joe
ID: 3 Name: Joe
ID: 4 Name: Joe
ID: 2 Name: Jimbo
ID: 3 Name: Jimbo
ID: 4 Name: Jimbo
ID: 2 Name: Mike
ID: 3 Name: Mike

编辑:这是我最终使用的。 (这里不知道缩进。)

但是现在我缺少数据库中的一个条目。

$result = mysql_query("
SELECT cl.ContactID, cn.FirstName
FROM TBL_ContactName AS cn
INNER JOIN TBL_ContactsList AS cl
ON cl.ContactID = cn.NameID
WHERE
cn.NameID != $userid
AND (
cn.NameID IN ($UserIDBList) OR cn.NameID IN ($UserIDAList)
)
");
输出如下所示。
ID:2 姓名:Joe
ID:3 姓名:Jimbo

但是当我输入 LEFT JOIN 时,我得到了这个。关闭但仍然缺少 ID。
ID:2 姓名:Joe
ID:3 姓名:Jimbo
ID:姓名:Mike

有什么想法吗??谢谢!

【问题讨论】:

  • 您应该尝试使用 LEFT 或 RIGHT 连接,而不是 FROM TBL_ContactsList, TBL_ContactName,具体取决于您的表结构
  • 嘿约翰普,你是对的。在所有 cmets 中,我缺少的是 JOIN ON。谢谢!
  • 谢谢大家!我选择了@Arda 和@dnl 的答案。但是现在我在查询中缺少一个条目。经过一些实验,使用 LEFT JOIN 几乎可以了,只是它缺少 ID。到目前为止,我使用代码和输出编辑了有关问题。
  • 缩进并不难。按空格键。
  • 好的,我发现了我的问题。最后,我不得不制作两个 qry,一个用于 UserIDA 和 UserIDB。但是 JOIN 中的所有帮助使它成为可能。谢谢!

标签: php mysql select join where


【解决方案1】:

您应该缩进和缩短您的 SQL 以获得更好的可读性

$result = mysql_query("
  SELECT cl.ContactID, cl.FirstName
  FROM TBL_ContactsList cl
  JOIN TBL_ContactName cn
  WHERE (
    cn.NameID != $userid AND
    cl.ContactID != $userid
  ) AND (
    cn.NameID IN ($UserIDAList) OR 
    cn.NameID IN ($UserIDBList)
  )
");

【讨论】:

  • 嘿,草皮,我选择了其他打开的答案,以使 qry 更具可读性。谢谢!
  • 恕我直言,使用单字母或双字母名称的别名表名称不会提高可读性。这就像在编程代码周围使用单字母或双字母变量名称一样——每次查看代码时,您都必须查看代码的其他部分,以找出所有这些“fl”、“fr”、 “hl”等实际上是什么意思。
【解决方案2】:

如果我的 SQL 结构正确,那么像这样更改 SQL 应该可以解决它。至少这是一个正确的用法。

$result=mysql_query("SELECT cl.ContactID, cn.FirstName FROM TBL_ContactsList cl INNER JOIN TBL_ContactName cn ON cn.NameID=cl.ContactID WHERE cn.NameID != $userid AND (CN.NameID IN ($UserIDAList) OR CL.NameID IN ($UserIDBList))");

【讨论】:

  • 谢谢阿尔达!这做到了!但它现在没有从数据库返回一个条目。我要调查一下。但这做到了!
【解决方案3】:

如果这对您有用,请提供反馈:

SELECT cl.ContactID, cn.FirstName 
  FROM TBL_ContactName AS cn 
  JOIN TBL_ContactsList as cl
    ON cn.NameID = cn.ContactID
  WHERE cn.NameID != $userid
    AND (cn.NameID IN ($UserIDAList) OR cn.NameID  IN ($UserIDBList));

【讨论】:

  • 这几乎做到了 dnl,谢谢!但我一直收到错误,所以我用“=”而不是“==”来回答 Arda 答案。谢谢你让我走上正轨!
猜你喜欢
  • 2012-12-07
  • 2014-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-28
相关资源
最近更新 更多