SQL-запрос возвращает поддельные дубликаты результатов? - PullRequest
0 голосов
/ 09 апреля 2011

Я пытался написать несколько маленьких плагинов для личного использования с 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 ]

2 голосов
/ 09 апреля 2011

Ну, это почти невозможно без каких-либо определений таблиц, но вы делаете много соединений там. Вы начинаете с tblhosting.id и идете оттуда вверх. Если какая-либо из подключенных таблиц имеет двойную запись, вы получите больше хитов

Вы можете добавить DISTINCT к вашему запросу, но это не решит основную проблему. Это может быть проблема с вашими данными: у вас есть 2 счета? Может быть, вы должны выбрать все (SELECT * FROM) и проверить, что возвращается, может быть, проверьте ваши таблицы для двойного содержания.

Использование DISTINCT в большинстве случаев не является хорошим выбором: это означает, что ваш запрос или ваши данные неверны (или вы не понимаете их полностью). Это может дать вам правильный результат на данный момент, но может привести к неприятностям позже.

Предположение о причине, по которой это происходит: Вы не подключаете таблицу продуктов к цепочке идентификаторов. Итак, вы, по сути, добавляете «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 голосов
/ 09 апреля 2011
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 голос
/ 09 апреля 2011

Я не вижу в вашем запросе ПРИСОЕДИНЯЙТЕСЬ к tblproducts, похоже, причина.

...