0

我一直在尝试编写一些用于 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 域进行了尝试它为每个匹配返回重复项..

任何帮助将非常感激 :)

4

3 回答 3

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'
于 2011-04-09T06:52:08.123 回答
2

好吧,如果没有任何表定义,它几乎是不可能的,但是你在那里做了很多连接。您从 tblhosting.id 开始,然后从那里“向上”工作。如果任何连接的表有双重输入,您将获得更多点击

您可以将 a 添加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'
于 2011-04-09T06:57:07.530 回答
1

我在您的查询中没有看到 JOIN to tblproducts,这似乎是一个原因。

于 2011-04-09T07:00:46.043 回答