Я пытаюсь написать несколько небольших плагинов для личного использования с 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 доменом в базе данных, и он возвратил дубликаты для каждого из совпадений.
Любая помощь будет высоко оценена :)
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'
Ну, это почти невозможно без каких-либо табличных определений, но вы там много присоединяетесь. Вы начинаете с 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'
Я не вижу в вашем запросе JOIN до tblproducts
, это, по-видимому, причина.