Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: Выборка из 2 таблиц из нескольких строк.
Покинул форум
Сообщений всего: 22
Дата рег-ции: Июнь 2011
Помог: 0 раз(а)
Добрый день. Столкнулся со следующей проблемой:
есть 2 таблички abon и uslugi. Соответственно по структуре у одного абонента, может быть несколько строк с записями о услугах (интернет, телефония, тв). Необходимо сделать выборку следующего вида: вывести количество абонентов у которых подключены телефон и телевидения на любом тарифном плане и интернет с определенным тарифным планом.
mysql_query('select count(*) from abon,uslugi where uslugi.usluga = \''.$us1.'\' and uslugi.usluga = \''.$us2.'\' and (uslugi.tp = \''.$tp.'\' and uslugi.usluga = \''.$us3.'\') and abon.dogovor = uslugi.dogovor;');
Но так не работает, т.к., насколько я понимаю, мускл пытается найти все это в одной строке таблицы uslugi.
Возникает вопрос - как правильно составить запрос, чтобы мне выдало количество абонентов у которых подключен Телефон, Телевидение и Интернет на тарифе "Тариф1". Заранее спасибо за помощь.
Покинул форум
Сообщений всего: 22
Дата рег-ции: Июнь 2011
Помог: 0 раз(а)
Так работает только если указать в условии только одну услугу. При добавлении в условие второй услуги (т.е. вывести количество абонентов у которых подключена Телефония и Телевидение) - выводит 0.
Покинул форум
Сообщений всего: 1234
Дата рег-ции: Июнь 2010
Помог: 69 раз(а)
Вместо JOIN--> LEFT JOIN или RIGHT JOIN
Мелкий
Отправлено: 21 Мая, 2012 - 09:56:49
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
Откуда вы вообще достали imya_uslugi? У вас нет такого поля!
Джойнить по text'у! охохохо, я в печали
А id у вас числовые потому что autoincrement по тексту не заработал?
----- PostgreSQL DBA
NightElf
Отправлено: 21 Мая, 2012 - 10:03:40
Новичок
Покинул форум
Сообщений всего: 22
Дата рег-ции: Июнь 2011
Помог: 0 раз(а)
То же самое. При поиске по одному критерию работает, по 2 - выводит 0 (Empty Set.)
На всякий случай уточню: нужно вывести не просто количество человек у которых есть ТВ и телефон, а именно тех - у кого ТВ и телефон одновременно.
Т.е. например всего 1000 человек, из них у 800 подключено ТВ, у 300 телефония, а одновременно эти две услуги подключены у 100 человек. Вот число 100 мне и нужно получить.
Насколько я это понимаю выборка JOINом будет выглядеть так: для абонента с 3 услугами (инет,тлф,тв) будет выбрано 3 строки, в первой строке вся инфа из таблицы абон + инфа из 1 строки таблицы услуги(по интернету), во второй строке вся инфа из таблицы абон + инфа из 2 строки таблицы услуги и т.д. Соответственно при задании условий все равно проверяется удовлетворяет ли всем условиям одна из строк. А т.к. ни в одной строке нет сразу нескольких наименований услуг, то и выборка выдает Empty Set.
(Добавление)
Мелкий пишет:
Откуда вы вообще достали imya_uslugi? У вас нет такого поля!
Это я поправил. Запрос при копировании забыл изменить.
Мелкий пишет:
А id у вас числовые потому что autoincrement по тексту не заработал?
Наследие предыдущего программиста. Я больше по железу, но вот сейчас на php+mysql подрядили, вот и разбираю.
Покинул форум
Сообщений всего: 2122
Дата рег-ции: Июнь 2010
Помог: 50 раз(а)
1. Если существует возможность изменения структуры таблиц бд - сделайте это.
Как минимум, - числовые внешние ключи для обоих таблиц.
2. Сделайте SELECT * FROM abon LEFT JOIN uslugi ON abon.dogovor = uslugi.dogovor ORDER BY abon.dogovor; И посмотрите смущает-ли что-то в выборке.
Учитывая, что зачем то хранятся текстовые наименования идентичных (по уму) услуг uslugi.usluga, попробуйте сразу выполнить выборку с LIKE... .
SELECT count(0)AS cnt, dogovor FROM uslugi WHERE usluga IN('Телефон','Телевидение')GROUPBY dogovor HAVING cnt=2
) services
Если на одном договоре нет одновременно 2 телефонов, например. Иначе сработает ошибочно.
----- PostgreSQL DBA
NightElf
Отправлено: 21 Мая, 2012 - 11:00:04
Новичок
Покинул форум
Сообщений всего: 22
Дата рег-ции: Июнь 2011
Помог: 0 раз(а)
Мелкий пишет:
Если на одном договоре нет одновременно 2 телефонов, например. Иначе сработает ошибочно.
К сожалению, у юр.лиц до 8 телефонов встречается на одном договоре. Но по физикам думаю пройдет - сейчас протестирую. Если я правильно понимаю - ошибочно сработает из-за того что указано количество строк - 2.
mysql>SELECT count(0)FROM(SELECT sum(usluga='Телефон')AS`haveTel`, sum(usluga='Телевидение')AS`haveTV`, dogovor FROM uslugi WHERE usluga IN('Телефон','Телевидение')GROUPBY dogovor HAVING`haveTV`AND`haveTel`) uslugi;
+----------+
| count(0)|
+----------+
| 0 |
+----------+
1 row INSET,1 warning (0.00 sec)
Тут попробовал просто вывести табличку чтобы была вида ФИО, тп-интернета, тп-телефона, тп-телевидения. Получилось, правда возможно несколько коряво, вот код выборки:
, то нумерация строк все равно остается от общего запроса. Т.е. первая строка имеет п/п 43, вторая 129 и т.д. Можно как то это решить? чтобы нумерация строк выводилась с учетом условия прописанного в IF, либо просто подсчитать количество выведенных строк с учетом условия?
Насколько я понимаю - самым простым вариантом является подсчитать количество строк <tr> у выведенной таблицы. Но вот как это реализовать - вопрос.
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.