SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 10.05.2013 15:42:58

Y_egor
Участник
Зарегистрирован: 10.05.2013
Сообщений: 13

Выборка по заданным условиям

Всем привет. Делаю выгрузку из базы данных по следующим параметрам из таблицы 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);

Может кто-то найти ошибку ?

Неактивен

 

#2 10.05.2013 15:55:02

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Выборка по заданным условиям

А что значит "ошибку"? Вы получаете неверный результат или СУБД говорит, что в запросе ошибка? и приведите полностью текст запроса, где уже подставлены всяческие $b и $c.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#3 10.05.2013 16:12:54

Y_egor
Участник
Зарегистрирован: 10.05.2013
Сообщений: 13

Re: Выборка по заданным условиям

Выдает такие ошибки

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)


Прикрепленные файлы:
Attachment Icon База данных.jpg, Размер: 311,668 байт, Скачано: 601

Неактивен

 

#4 10.05.2013 16:38:00

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Выборка по заданным условиям

Проверяйте то, что вернула функция mysql_query - может быть она вернула FALSE.
Текст запроса, который я просил привести выше получите вот так примерно:

$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 ) )";

print $query;

$result = mysql_query ($query, $db);

if ( FALSE === $result ) {
  die ('Нас посетила толстая полярная лисичка...');
}
 


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#5 10.05.2013 16:50:50

Y_egor
Участник
Зарегистрирован: 10.05.2013
Сообщений: 13

Re: Выборка по заданным условиям

Вот что получилось:

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)

Неактивен

 

#6 10.05.2013 17:08:24

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Выборка по заданным условиям

Так, судя по появившейся лисичке, в запросе-таки ошибка.
Приведите сюда результат запроса

show create table `credits`;


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#7 10.05.2013 17:17:35

Y_egor
Участник
Зарегистрирован: 10.05.2013
Сообщений: 13

Re: Выборка по заданным условиям

Извините, не совсем понял, как этот запрос описать и как его вывести. Я не супер профессионал, а только учусь smile

Отредактированно Y_egor (10.05.2013 17:27:49)

Неактивен

 

#8 10.05.2013 17:39:13

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Выборка по заданным условиям

Не надо запрос описывать, я же привел его цельно.

Судя по приложенному Вами скриншоту, Вы работаете в phpmyadmin, запустите запрос

show create table `credits`;

в нем и приложите результат сюда.

Мне нужна структура таблицы credits, что-то вроде
create table t_6547(id int, user_id int, user_to int, mess varchar(255), date int);


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#9 10.05.2013 17:49:11

Y_egor
Участник
Зарегистрирован: 10.05.2013
Сообщений: 13

Re: Выборка по заданным условиям

Прилаживаю скриншот структуры таблицы


Прикрепленные файлы:
Attachment Icon Структура базы данных.jpg, Размер: 362,920 байт, Скачано: 614

Неактивен

 

#10 10.05.2013 17:53:08

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Выборка по заданным условиям

Спасибо, но мне нужно в виде текста, а не в виде картинки smile.
Вы посмотрели структуру во вкладке "обзор", перейдите во вкладку "SQL", выполните приведенный мной запрос и приведите результат в виде текста.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#11 10.05.2013 17:57:22

Y_egor
Участник
Зарегистрирован: 10.05.2013
Сообщений: 13

Re: Выборка по заданным условиям

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

Неактивен

 

#12 10.05.2013 18:10:47

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Выборка по заданным условиям

Ага, хорошо...
Замените в запросе
MIN (min_bl)
на
MIN(min_bl)
(то есть уберите пробел после MIN) - должно помочь.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#13 10.05.2013 18:17:34

Y_egor
Участник
Зарегистрирован: 10.05.2013
Сообщений: 13

Re: Выборка по заданным условиям

Заменил, не помогло sad

Вот код:

$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)

Неактивен

 

#14 10.05.2013 18:28:13

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Выборка по заданным условиям

Лучше отлаживайте ошибки так:
$result = mysql_query ($query, $db) or die(mysql_error());

Скорее всего подзапрос выдал несколько значений, а в выражении стоит =. Сделайте так, чтобы подзапрос возвращал одно значение.

Неактивен

 

#15 10.05.2013 18:52:08

Y_egor
Участник
Зарегистрирован: 10.05.2013
Сообщений: 13

Re: Выборка по заданным условиям

В моем понимании эта часть кода:
AND site = (SELECT DISTINCT site FROM credits WHERE min_bl = (SELECT MIN(min_bl) FROM credits ) )
Работает так:
Выводя все переменные site она находит дубль этой переменной, после чего она удаляет 1 дубль из множестава (может быть 2-6 дублей). При удалении дубля программа обращает внимание на показатель переменной min_bl и строку с самым БОЛЬШИМ показателем выводит на экран, а все остальные дубли не выводятся. Все остальные строки где нет дублей выводятся в порядке очереди. Я правильно отобразил код для такого алгоритма ?

Неактивен

 

#16 10.05.2013 21:15:34

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Выборка по заданным условиям

Попробуйте лучше что-нибудь такого толка:

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;


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#17 12.05.2013 23:19:04

Y_egor
Участник
Зарегистрирован: 10.05.2013
Сообщений: 13

Re: Выборка по заданным условиям

Почти подошло решение smile

Единственное дубли немного не так себя ведут.
Есть база данных (во вложении скриншот), на скриншоте в первых трех позициях видно, что переменная 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 строка, а она не подставляется sad
И этот сайт вообще не высвечивается в результатах. Где ж тут что-то дописать нужно...


Прикрепленные файлы:
Attachment Icon База данных.jpg, Размер: 311,668 байт, Скачано: 597

Неактивен

 

#18 12.05.2013 23:43:33

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Выборка по заданным условиям

Y_egor написал:

При таком коде у меня получается, что при дублировании переменной site учитывается только максимальное значение min_bl, а все другие значения вообще не учитывает.

А вообще я исходил из А также если есть дубли site , то вывести site где значение min_bl больше.
Ну то есть и выводится то, где min_bl больше,  не очень пойму, что не так.

Для ясности приведите набор данных в таблице (приведите только id, site, min_bl, остальные поля не нужны в данном контексте), какой набор даёт мой запрос, чем он не устраивает, и какой результат Вы хотите получить.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#19 13.05.2013 00:57:43

Y_egor
Участник
Зарегистрирован: 10.05.2013
Сообщений: 13

Re: Выборка по заданным условиям

Есть такая база данных:

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);

Неактивен

 

#20 13.05.2013 02:17:13

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Выборка по заданным условиям

Тут дело в следующем: посмотрите на строку
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;


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#21 13.05.2013 02:37:29

Y_egor
Участник
Зарегистрирован: 10.05.2013
Сообщений: 13

Re: Выборка по заданным условиям

Идеально !!! Спасибо большое - пару недель уже мучался smile

Удачи Вашему сайту !!!

P/S
Пользователи, не забывайте переходить по рекламе данного проекта - поддержим успешный проект ! smile

Отредактированно Y_egor (13.05.2013 02:45:36)

Неактивен

 

#22 05.06.2013 17:16:04

gcib
Забанен
Откуда: Феодосия
Зарегистрирован: 26.04.2010
Сообщений: 2

Re: Выборка по заданным условиям

Y_egor написал:

Идеально !!! Спасибо большое - пару недель уже мучался smile
Удачи Вашему сайту !!!
P/S: Пользователи, не забывайте переходить по рекламе данного проекта - поддержим успешный проект ! smile

А вы в курсе, что любые призывы кликать по рекламе не приветствуются операторами контекстной рекламы? smile

Отредактированно gcib (05.06.2013 17:19:36)

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson