SQL Query返回假的重复结果?

时间:2011-04-09 06:48:23

标签: mysql perl whmcs

我一直在努力为WHMCS写一些个人用的小插件。基本上我在这里尝试做的是获取一些关于某个订单的信息,并将其作为Perl中的数组返回。

Perl位我很好,这是我形成的MySQL查询给了我压力..

我知道这很大而且很乱,但我拥有的是:

SELECT tblhosting.id, tblhosting.userid, tblhosting.orderid, tblhosting.packageid,   tblhosting.server, tblhosting.domain, tblhosting.username, tblorders.invoiceid, tblproducts.gid, tblservers.ipaddress, tblinvoices.status
    FROM tblhosting, tblproducts, tblorders, tblinvoices, tblservers
  WHERE tblorders.status = 'Pending'
  AND tblproducts.gid = '2'
  AND tblservers.id = tblhosting.server
  AND tblorders.id = tblhosting.orderid
  AND tblinvoices.id = tblorders.invoiceid
  AND tblinvoices.status = 'Paid'

我不知道这是/应该/是否有效,但我认为我是在正确的轨道上,因为它确实返回了我正在寻找的东西,但它会将所有东西都返回两次。

例如,我创建了一个域名为“sunshineee.info”的新帐户,然后在PHPMyAdmin中运行了上述查询。

id  userid  orderid     packageid   server  domain  username    invoiceid   gid     ipaddress   status
13  7   17  6   1   sunshineee.info     sunshine    293     2   184.22.145.196  Paid
13  7   17  6   1   sunshineee.info     sunshine    293     2   184.22.145.196  Paid

任何人都可以告诉我这个问题出在哪里。不好意思(可能不是很明显)我想要这个,因为每场比赛只返回一行..我已经尝试过> 1数据库中的域,并为每个匹配返回重复项。

非常感谢任何帮助 :)

3 个答案:

答案 0 :(得分:2)

SELECT distinct tblhosting.id, tblhosting.userid, tblhosting.orderid, tblhosting.packageid,   tblhosting.server, tblhosting.domain, tblhosting.username, tblorders.invoiceid, tblproducts.gid, tblservers.ipaddress, tblinvoices.status
FROM tblhosting, tblproducts, tblorders, tblinvoices, tblservers
  WHERE tblorders.status = 'Pending'
    AND tblproducts.gid = '2'
    AND tblservers.id = tblhosting.server
    AND tblorders.id = tblhosting.orderid
    AND tblinvoices.id = tblorders.invoiceid
    AND tblinvoices.status = 'Paid'

答案 1 :(得分:2)

嗯,没有任何表定义,它几乎是不可能的,但你在那里做了很多连接。你开始使用tblhosting.id并从那里开始“向上”工作。如果任何连接的表具有双重条目,您将获得更多命中

您可以在查询中添加DISTINCT,但这不会解决根本问题。这可能是您数据的问题:您有2张发票吗?也许您应该选择所有内容(SELECT * FROM)并检查返回的内容,或者检查您的表格是否有双重内容。

使用DISTINCT大部分时间都不是一个好的选择:它表示您的查询或数据不正确(或者您不完全理解它们)。它现在可能会让你得到正确的结果,但以后会让你遇到麻烦。

猜测发生这种情况的原因: 您没有将products表连接到id的链。所以你基本上可以在你的结果中添加一个'2'。你加入产品,唯一限制该表的是“gid”应该是2.所以如果你添加一个带有gid 2的产品,你会得到另一个结果。要么加入它(也许是tblproduct.orderid = tblorders.id?只是在这里猜测)或者只是删除它,因为它在我看不到任何事情。

如果您想让查询更清晰一些,请尝试不要隐式加入,而是这样做。所以你实际上可以看到发生了什么

SELECT tblhosting.id, tblhosting.userid, tblhosting.orderid, tblhosting.packageid,   tblhosting.server, tblhosting.domain, tblhosting.username, tblorders.invoiceid, tblproducts.gid, tblservers.ipaddress, tblinvoices.status
FROM tblhosting
  JOIN tblproducts ON /*you're missing something here!*/
  JOIN tblorders ON tblorders.id = tblhosting.orderid
  JOIN tblinvoices ON tblinvoices.id = tblorders.invoiceid
  JOIN tblservers ON tblservers.id = tblhosting.server
WHERE 
  tblorders.status = 'Pending'
  AND tblproducts.gid = '2'
  AND tblinvoices.status = 'Paid'

答案 2 :(得分:1)

我在查询中没有看到加入tblproducts,这似乎是一个原因。