SQL-запрос возвращает поддельные дубликаты результатов?

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

Может ли кто-нибудь дать мне хедз-ап о том, где я ошибся с этим... Obvioiusly (может быть, не совсем очевидно) Я хочу, чтобы это только одна строка возвращалась за матч. Я пробовал это s > 1 доменом в базе данных, и он возвратил дубликаты для каждого из совпадений.

Любая помощь будет высоко оценена :)

Теги:
whmcs

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'
  • 0
    Большое спасибо!!
  • 0
    Различный будет обойти (скрыть) вашу непосредственную проблему, но вы должны попытаться выяснить, почему вы получаете повторяющиеся результаты. Вы, вероятно, пропускаете предложение where, которое объединяет две ваши таблицы ... Смотрите ответ Nanne ниже.
Показать ещё 1 комментарий
2

Ну, это почти невозможно без каких-либо табличных определений, но вы там много присоединяетесь. Вы начинаете с 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'
  • 0
    Я ценю головы. Я удостоверился, что в базе данных нет дубликатов или неверных данных, поэтому я опускаю их в свой неаккуратный запрос. Использование «DISTINCT» действительно сейчас, похоже, решает проблему, однако я понимаю, что мне просто придется найти другой способ обойти эту проблему. Честно говоря, это всего лишь прототип, который я могу использовать, пока у меня не будет достаточно времени и достаточного базового кода, чтобы этот проект действительно заработал ... Думаю, сейчас было бы гораздо лучше иметь дело с этим, хотя в будущем это будет еще хуже, когда все это будет на рабочем сервере ... Еще раз спасибо! ! :)
  • 0
    Так что же происходит, когда вы «выбираете *»?
Показать ещё 3 комментария
1

Я не вижу в вашем запросе JOIN до tblproducts, это, по-видимому, причина.

  • 0
    Спасибо за это ... Я изменил запрос, чтобы включить WHERE tblorders.status = 'Pending' И tblproducts.id = tblhosting.packageid ... И, похоже, это так;)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню