Задавайте вопросы, мы ответим
Вы не зашли.
Всем привет. Делаю выгрузку из базы данных по следующим параметрам из таблицы Credits нужно вывести все поля, которые удовлетворяют следующим условиям:
1. min_bl между 0 и $b
2. old_attestat между 0 и $c
3. А также если есть дубли site , то вывести site где значение min_bl больше
Код:
$result = mysql_query ("SELECT * FROM Credits WHERE min_bl BETWEEN 0 AND ".$b." AND old_attestat BETWEEN 0 AND ".$c." AND site = (SELECT DISTINCT site FROM Credits WHERE min_bl = (SELECT MIN (min_bl) FROM Credits ) )", $db);
$myrow = mysql_fetch_array ($result);
Может кто-то найти ошибку ?
Неактивен
А что значит "ошибку"? Вы получаете неверный результат или СУБД говорит, что в запросе ошибка? и приведите полностью текст запроса, где уже подставлены всяческие $b и $c.
Неактивен
Выдает такие ошибки
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in S:\home\localhost\www\monitoring\public_html\find.php on line 87
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in S:\home\localhost\www\monitoring\public_html\find.php on line 111
Код:
$b = 25 ;
$c = 44 ;
$result = mysql_query ("SELECT * FROM credits WHERE min_bl BETWEEN 0 AND ".$b." AND old_attestat BETWEEN 0 AND ".$c." AND site = (SELECT DISTINCT site FROM credits WHERE min_bl = (SELECT MIN (min_bl) FROM credits ) )", $db);
$myrow = mysql_fetch_array ($result);
Пункты
1. min_bl между 0 и $b
2. old_attestat между 0 и $c
Работают верно, а вот пункт 3 никак побороть не могу...
Отредактированно Y_egor (10.05.2013 16:22:57)
Неактивен
Проверяйте то, что вернула функция mysql_query - может быть она вернула FALSE.
Текст запроса, который я просил привести выше получите вот так примерно:
Неактивен
Вот что получилось:
SELECT * FROM credits WHERE min_bl BETWEEN 0 AND 25 AND old_attestat BETWEEN 0 AND 44 AND site = (SELECT DISTINCT site FROM credits WHERE min_bl = (SELECT MIN (min_bl) FROM credits ) )Нас посетила толстая полярная лисичка...
Пункт "3. А также если есть дубли site , то вывести site где значение min_bl больше" так и не работает где-то в этой части кода ошибка
AND site = (SELECT DISTINCT site FROM credits WHERE min_bl = (SELECT MIN (min_bl) FROM credits ) )
Хочу более детально описать этот пункт: есть таблица credits, где по одному и тому же сайту (переменная site) может быть несколько строк, где данные отличаются по переменной min_bl . И поэтому при выборке из таблицы если есть дубли переменной site нужно вывести ту строку, у которой переменная min_bl больше.
Отредактированно Y_egor (10.05.2013 17:07:06)
Неактивен
Так, судя по появившейся лисичке, в запросе-таки ошибка.
Приведите сюда результат запроса
show create table `credits`;
Неактивен
Извините, не совсем понял, как этот запрос описать и как его вывести. Я не супер профессионал, а только учусь
Отредактированно Y_egor (10.05.2013 17:27:49)
Неактивен
Не надо запрос описывать, я же привел его цельно.
Судя по приложенному Вами скриншоту, Вы работаете в phpmyadmin, запустите запрос
show create table `credits`;
в нем и приложите результат сюда.
Мне нужна структура таблицы credits, что-то вроде
create table t_6547(id int, user_id int, user_to int, mess varchar(255), date int);
Неактивен
Прилаживаю скриншот структуры таблицы
Неактивен
Спасибо, но мне нужно в виде текста, а не в виде картинки .
Вы посмотрели структуру во вкладке "обзор", перейдите во вкладку "SQL", выполните приведенный мной запрос и приведите результат в виде текста.
Неактивен
Table Create Table
credits CREATE TABLE `credits` (
`id` int(3) NOT NULL AUTO_INCREMENT,
`site` varchar(255) NOT NULL DEFAULT '',
`attestat` varchar(255) NOT NULL DEFAULT '',
`min_bl` int(4) NOT NULL DEFAULT '0',
`max_summa` int(6) NOT NULL DEFAULT '0',
`max_percent` float NOT NULL DEFAULT '0',
`min_percent` float NOT NULL DEFAULT '0',
`day` varchar(10) NOT NULL DEFAULT '',
`return` varchar(4) NOT NULL DEFAULT '',
`wmc` varchar(15) NOT NULL DEFAULT '',
`old_attestat` varchar(10) NOT NULL DEFAULT '',
`old` varchar(10) NOT NULL DEFAULT '',
`pretension` char(3) NOT NULL DEFAULT '',
`credit_bl` varchar(255) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=43 DEFAULT CHARSET=cp1251
Неактивен
Ага, хорошо...
Замените в запросе
MIN (min_bl)
на
MIN(min_bl)
(то есть уберите пробел после MIN) - должно помочь.
Неактивен
Заменил, не помогло
Вот код:
$b = 25 ;
$c = 44 ;
$result = mysql_query ("SELECT * FROM credits WHERE min_bl BETWEEN 0 AND ".$b." AND old_attestat BETWEEN 0 AND ".$c." AND site = (SELECT DISTINCT site FROM credits WHERE min_bl = (SELECT MIN(min_bl) FROM credits ) )", $db);
$myrow = mysql_fetch_array ($result);
Вот ошибка:
Warning: mysql_query() [function.mysql-query]: Unable to save result set in S:\home\localhost\www\monitoring\public_html\find.php on line 86
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in S:\home\localhost\www\monitoring\public_html\find.php on line 88
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in S:\home\localhost\www\monitoring\public_html\find.php on line 112
Если убрать часть кода: AND site = (SELECT DISTINCT site FROM credits WHERE min_bl = (SELECT MIN(min_bl) FROM credits ) )
то работает выборка по БЛ, а вот чтоб дубли убирало не работает !!!
Может можно его как-то на 2 действия разделить ? Сначала выборка, а потом уборка дублей !
Отредактированно Y_egor (10.05.2013 18:27:22)
Неактивен
Лучше отлаживайте ошибки так:
$result = mysql_query ($query, $db) or die(mysql_error());
Скорее всего подзапрос выдал несколько значений, а в выражении стоит =. Сделайте так, чтобы подзапрос возвращал одно значение.
Неактивен
В моем понимании эта часть кода:
AND site = (SELECT DISTINCT site FROM credits WHERE min_bl = (SELECT MIN(min_bl) FROM credits ) )
Работает так:
Выводя все переменные site она находит дубль этой переменной, после чего она удаляет 1 дубль из множестава (может быть 2-6 дублей). При удалении дубля программа обращает внимание на показатель переменной min_bl и строку с самым БОЛЬШИМ показателем выводит на экран, а все остальные дубли не выводятся. Все остальные строки где нет дублей выводятся в порядке очереди. Я правильно отобразил код для такого алгоритма ?
Неактивен
Попробуйте лучше что-нибудь такого толка:
SELECT c.* FROM (SELECT `site`, max(`min_bl`) AS `min_bl` FROM `credits` GROUP BY `site`) sub_query JOIN `credits` c USING(site,min_bl) WHERE c.min_bl >= 0 AND c.min_bl <= НУЖНОЕ_ЗНАЧЕНИЕ AND c.old_attestat >= 0 AND c.old_attestat <= ДРУГОЕ_НУЖНОЕ_ЗНАЧЕНИЕ ORDER BY c.site;
Неактивен
Почти подошло решение
Единственное дубли немного не так себя ведут.
Есть база данных (во вложении скриншот), на скриншоте в первых трех позициях видно, что переменная site одинаковая.
Вот мой код:
$b = 26 ;
$c = 36 ;
$result = mysql_query ("SELECT c.* FROM (SELECT `site`, max(`min_bl`) AS `min_bl` FROM `credits` GROUP BY `site`) sub_query JOIN `credits` c USING(site,min_bl) WHERE c.min_bl >= 0 AND c.min_bl <= ".$b." AND c.old_attestat >= 0 AND c.old_attestat <= ".$c." ORDER BY c.site;", $db);
$myrow = mysql_fetch_array ($result);
При таком коде у меня получается, что при дублировании переменной site учитывается только максимальное значение min_bl, а все другие значения вообще не учитывает.
Т.е. в моем примере, в базе данных 3 строка под такие переменные $b и $c не подходит и должна подставиться 2 строка, а она не подставляется
И этот сайт вообще не высвечивается в результатах. Где ж тут что-то дописать нужно...
Неактивен
Y_egor написал:
При таком коде у меня получается, что при дублировании переменной site учитывается только максимальное значение min_bl, а все другие значения вообще не учитывает.
А вообще я исходил из А также если есть дубли site , то вывести site где значение min_bl больше.
Ну то есть и выводится то, где min_bl больше, не очень пойму, что не так.
Для ясности приведите набор данных в таблице (приведите только id, site, min_bl, остальные поля не нужны в данном контексте), какой набор даёт мой запрос, чем он не устраивает, и какой результат Вы хотите получить.
Неактивен
Есть такая база данных:
id site min_bl old_attestat
1 24WM 1 1
2 24WM 10 30
3 24WM 25 45
4 Credit-WM 50 180
5 Sairoscredit 0 0
6 wmkredit 0 0
7 WMC 0 0 0
8 MavBANK 10 10
9 WM-Credit 5 30
10 SaveCredit 20 25
При заданных $b (min_bl) = 25 и $c (old_attestat) = 40 - данные могут быть различными
Должно вывести такую базу данных (должно вывести все столбцы где min_bl=>0 или <=25 и в то же время old_attestat =>0 или <=40, если встречаются дубли переменной site , то должна остаться строка, которая наиболее подходит к этим условиям) :
id site min_bl old_attestat
2 24WM 10 30
5 Sairoscredit 0 0
6 wmkredit 0 0
7 WMC 0 0
8 MavBANK 10 10
9 WM-Credit 5 30
10 SaveCredit 20 25
А у меня выводиться, все как нужно, но без id 2 :
id site min_bl old_attestat
5 Sairoscredit 0 0
6 wmkredit 0 0
7 WMC 0 0
8 MavBANK 10 10
9 WM-Credit 5 30
10 SaveCredit 20 25
Код:
$b = 25 ;
$c = 40 ;
$result = mysql_query ("SELECT c.* FROM (SELECT `site`, max(`min_bl`) AS `min_bl` FROM `credits` GROUP BY `site`) sub_query JOIN `credits` c USING(site,min_bl) WHERE c.min_bl >= 0 AND c.min_bl <= ".$b." AND c.old_attestat >= 0 AND c.old_attestat <= ".$c." ORDER BY c.site;", $db);
$myrow = mysql_fetch_array ($result);
Неактивен
Тут дело в следующем: посмотрите на строку
3 24WM 25 45
в ней old_attestat=45.
А в запросе стоит условие отсеивания тех строк, у которых old_attestat <=40. Она и отсеивается.
Вот и получается, что сперва эта строка в подзапросе выбирается (потому что у нее максимальный bl_min), а потом, уже после соединения join'ом - она отсеивается на этапе применения условия WHERE.
Видимо, нужно отсеивать нужные строки еще на этапе подзапроса. То есть попробуйте такую модификацию запроса (я просто перенес условие WHERE в подзапрос):
SELECT c.* FROM (SELECT `site`, max(`min_bl`) AS `min_bl` FROM `credits` WHERE min_bl >= 0 AND min_bl <= НУЖНОЕ_ЗНАЧЕНИЕ AND old_attestat >= 0 AND old_attestat <= ДРУГОЕ_НУЖНОЕ_ЗНАЧЕНИЕ GROUP BY `site`) sub_query JOIN `credits` c USING(site,min_bl) ORDER BY c.site;
Неактивен
Идеально !!! Спасибо большое - пару недель уже мучался
Удачи Вашему сайту !!!
P/S
Пользователи, не забывайте переходить по рекламе данного проекта - поддержим успешный проект !
Отредактированно Y_egor (13.05.2013 02:45:36)
Неактивен
Y_egor написал:
Идеально !!! Спасибо большое - пару недель уже мучался
Удачи Вашему сайту !!!
P/S: Пользователи, не забывайте переходить по рекламе данного проекта - поддержим успешный проект !
А вы в курсе, что любые призывы кликать по рекламе не приветствуются операторами контекстной рекламы?
Отредактированно gcib (05.06.2013 17:19:36)
Неактивен