ФорумПрограммированиеPHP для идиотов → Построить сложный sql запрос.

Построить сложный sql запрос.

  • mario

    Сообщения: 6067 Репутация: N Группа: Джедаи

    Spritz 28 апреля 2009 г. 23:43

    Доброго времени суток!
    Вообщем кто может объяснить на пальцах про вложенные запросы…
    А суть в моей проблеме заключается в следующем
    Есть 3 таблицы "группы", "свойства", "таблца свойств и групп - тут запись на принадлежность свойства к группе":
    CREATE TABLE `group` (
    `id` int(10) unsigned NOT NULL auto_increment,
    `title` varchar(500) NOT NULL,
    PRIMARY KEY (`id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
    CREATE TABLE `properties` (
    `id` int(10) unsigned NOT NULL auto_increment,
    `title` varchar(255) NOT NULL,
    `name` varchar(500) NOT NULL,
    `prefix` text NOT NULL,
    `sufix` text NOT NULL,
    `type` int(10) unsigned NOT NULL,
    PRIMARY KEY (`id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
    CREATE TABLE `properties_table` (
    `properties_id` int(10) unsigned NOT NULL,
    `group_id` int(10) unsigned NOT NULL,
    `search` int(1) unsigned NOT NULL,
    `range` int(1) unsigned NOT NULL,
    `position` int(10) unsigned NOT NULL
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8;

    Надо сделать вывод свойств для определенной группы, допустим
    записи в таблицах
    INSERT INTO `group` (id, title) VALUES (1, 'Группа1')
    INSERT INTO `properties` (id, title, name, prefix, sufix, type) VALUES (
    1, 'prop1', 'prefixfor1' 'sufixfor1' '1';
    2, 'prop2', 'abra' 'cadabra' '3';
    3, 'prop3', 'sim' 'salabim' '2';)
    INSERT INTO `group` (properties_id, group_id, search, range, position) VALUES (1, 1, 1, 0, 01; 3,1,0,0,02)

    И что бы выводило для "Группа1"
    prop1 ….тут данные…. (поле отмечено галкой что принадлежит к группе)
    prop3 ….тут данные…. (поле отмечено галкой что принадлежит к группе)
    prop2 …тут данные…. (поле не отмечено, значит не принадлежит)
    Вообщем что бы сначала выводило свойства те которые принадлежат к группе(сортировка по group.position) а следом выводило оставшиеся свойства(сортировка по properties.id или имени тут похуй.).
    до меня дошло что надо сделать два запроса где вначале будет учитываться принадлежность в группе(array1) и где нету принадлежности к группе(array2)
    и потом склеить эти 2 массива [man]array_merge[/man]. Вообщем не могу построить эти два запроса…, прошу помощи вас.
  • mario

    Сообщения: 6067 Репутация: N Группа: Джедаи

    Spritz 29 апреля 2009 г. 0:16, спустя 32 минуты 15 секунд

    может чего непонятно, может не правильно чего думаю, так вы говорите :)
  • ubica

    Сообщения: 530 Репутация: N Группа: Кто попало

    Spritz 29 апреля 2009 г. 0:29, спустя 12 минут 54 секунды

    mario, JOIN?
  • mario

    Сообщения: 6067 Репутация: N Группа: Джедаи

    Spritz 29 апреля 2009 г. 0:31, спустя 2 минуты 33 секунды


    Вообщем кто может объяснить на пальцах про вложенные запросы...


    mario, JOIN?

    да,их же еще называют вложенные запросы?, я вот только все ни как не допетлю как их правильно строить
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 29 апреля 2009 г. 0:32, спустя 1 минуту 3 секунды



    Вообщем кто может объяснить на пальцах про вложенные запросы...


    mario, JOIN?

    да,их же еще называют вложенные запросы?, я вот только все ни как не допетлю как их правильно строить
    нет, это не вложенные запросы)) это джойн. вложеные запросы - запросы вида

    select * from news where id IN (SELECT id FORM catalog where name like 'пиздец%')
    Сапожник без сапог
  • mario

    Сообщения: 6067 Репутация: N Группа: Джедаи

    Spritz 29 апреля 2009 г. 0:34, спустя 1 минуту 29 секунд




    Вообщем кто может объяснить на пальцах про вложенные запросы...


    mario, JOIN?

    да,их же еще называют вложенные запросы?, я вот только все ни как не допетлю как их правильно строить
    нет, это не вложенные запросы)) это джойн. вложеные запросы - запросы вида

    select * from news where id IN (SELECT id FORM catalog where name like 'пиздец%')

    ясно, значит ошибся…
    Я так понимаю тут надо юзать join, я с ним и пытаюсь уже с час, нихуя не выходит… :(
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 29 апреля 2009 г. 0:36, спустя 2 минуты 24 секунды

    mario, ну не выходит, так похуй, попробуй войди тогда ;)
    Сапожник без сапог
  • ubica

    Сообщения: 530 Репутация: N Группа: Кто попало

    Spritz 29 апреля 2009 г. 0:39, спустя 2 минуты 33 секунды


    SELECT * FROM `properties` AS `p` INNER JOIN `groups` AS `g` ON `g`.`id`=`p`.`groupid` WHERE `g`.`title`='охуенная группа'
  • mario

    Сообщения: 6067 Репутация: N Группа: Джедаи

    Spritz 29 апреля 2009 г. 0:50, спустя 10 минут 59 секунд



    SELECT * FROM `properties` AS `p` INNER JOIN `groups` AS `g` ON `g`.`id`=`p`.`groupid` WHERE `g`.`title`='охуенная группа'


    не…
    щас попробую
    тут типо что то этого надо
    SELECT * FROM `properties_table` AS pt LEFT JOIN `properties` AS p ON pt.group.id='$id' AND pt.property_id=p.id WHERE …вот с условием я не могу разобраться… как бы правильно его построить… ORDER BY pt.position.
    SELECT * FROM `properties_table` AS pt LEFT JOIN `properties` AS p ON pt.group.id='$id' AND pt.property_id=p.id WHERE …вот с условием я не могу разобраться… как бы правильно его построить… ORDER BY p.id

    вот два запроса, я их как бы должен поместить в массивы и склеить(это конечно все только на листике с бумагой пока расписано…) а вот уже в коде запутался.. :(
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 29 апреля 2009 г. 0:52, спустя 2 минуты 31 секунду

    слабоват. учись студент.

    SELECT `puppy_users`.paytipe AS account_type, `puppy_users`.`type` AS user_type,`puppy_listings`.*, ROUND(DATEDIFF(NOW(),FROM_UNIXTIME(`puppy_listings`.birthdate))/31) AS month_count, `puppy_users`.userdata AS owner_data, `puppy_dogtypes`.name AS typename, `geo_countries`.`country_name` as `country_name` , `geo_cities`.`city_name` as `city_name` FROM `puppy_listings` INNER JOIN `puppy_users` ON `puppy_users`.id=`puppy_listings`.owner INNER JOIN `puppy_dogtypes` ON `puppy_dogtypes`.id=`puppy_listings`.type INNER JOIN `geo_countries` ON `geo_countries`.`country_id`= `puppy_listings`.`country_id` INNER JOIN `geo_cities` ON `geo_cities`.`city_id`= `puppy_listings`.`city_id` WHERE `puppy_listings`.`state`!='closed' AND `puppy_listings`.`time`+86400*IF(`puppy_users`.paytipe <> '',IF(`puppy_users`.paytipe='gold',14,21),7) > UNIX_TIMESTAMP(NOW()) AND `puppy_listings`.`price`>=500 ORDER BY `time` DESC LIMIT 3
    Сапожник без сапог
  • ubica

    Сообщения: 530 Репутация: N Группа: Кто попало

    Spritz 29 апреля 2009 г. 0:53, спустя 55 секунд

    ON pt.group.id

    так нельзя :)
  • mario

    Сообщения: 6067 Репутация: N Группа: Джедаи

    Spritz 29 апреля 2009 г. 0:54, спустя 1 минуту 25 секунд


    ON pt.group.id

    так нельзя :)

    а как можно, и если не сложно объясни плз :)
  • mario

    Сообщения: 6067 Репутация: N Группа: Джедаи

    Spritz 29 апреля 2009 г. 0:56, спустя 1 минуту 12 секунд

    сдела попровачку, что бы читать удобнее было.

    [//code]


    слабоват. учись студент.

    SELECT `puppy_users`.paytipe AS account_type, `puppy_users`.`type` AS user_type,`puppy_listings`.*, ROUND(DATEDIFF(NOW(),FROM_UNIXTIME(`puppy_listings`.birthdate))/31) AS month_count, `puppy_users`.userdata AS owner_data, `puppy_dogtypes`.name AS typename, `geo_countries`.`country_name` as `country_name` , `geo_cities`.`city_name` as `city_name`
    FROM `puppy_listings` INNER JOIN `puppy_users`
    ON `puppy_users`.id=`puppy_listings`.owner INNER JOIN `puppy_dogtypes`
    ON `puppy_dogtypes`.id=`puppy_listings`.type INNER JOIN `geo_countries` ON `geo_countries`.`country_id`= `puppy_listings`.`country_id`
    INNER JOIN `geo_cities` ON `geo_cities`.`city_id`= `puppy_listings`.`city_id`
    WHERE `puppy_listings`.`state`!='closed' AND `puppy_listings`.`time`+86400*IF(`puppy_users`.paytipe <> '',IF(`puppy_users`.paytipe='gold',14,21),7) > UNIX_TIMESTAMP(NOW())
    AND `puppy_listings`.`price`>=500 ORDER BY `time` DESC LIMIT 3


    SELECT `puppy_users`.paytipe AS account_type, `puppy_users`.`type` AS user_type,`puppy_listings`.*,
    ROUND(DATEDIFF(NOW(),
    FROM_UNIXTIME(`puppy_listings`.birthdate))/31) AS month_count, `puppy_users`.userdata AS owner_data, `puppy_dogtypes`.name AS typename, `geo_countries`.`country_name` as `country_name` , `geo_cities`.`city_name` as `city_name` FROM `puppy_listings` INNER JOIN `puppy_users`
    ON `puppy_users`.id=`puppy_listings`.owner INNER JOIN `puppy_dogtypes` ON `puppy_dogtypes`.id=`puppy_listings`.type INNER JOIN `geo_countries`
    ON `geo_countries`.`country_id`= `puppy_listings`.`country_id`
    INNER JOIN `geo_cities` ON `geo_cities`.`city_id`= `puppy_listings`.`city_id`
    WHERE `puppy_listings`.`state`!='closed' AND `puppy_listings`.`time`+86400*IF(`puppy_users`.paytipe <> '',IF(`puppy_users`.paytipe='gold',14,21),7) > UNIX_TIMESTAMP(NOW()) AND `puppy_listings`.`price`>=500 ORDER BY `time` DESC LIMIT 3
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 29 апреля 2009 г. 0:56, спустя 45 секунд


    сдела попровачку, что бы читать удобнее было.

    [//code]


    слабоват. учись студент.

    SELECT `puppy_users`.paytipe AS account_type, `puppy_users`.`type` AS user_type,`puppy_listings`.*, ROUND(DATEDIFF(NOW(),FROM_UNIXTIME(`puppy_listings`.birthdate))/31) AS month_count, `puppy_users`.userdata AS owner_data, `puppy_dogtypes`.name AS typename, `geo_countries`.`country_name` as `country_name` , `geo_cities`.`city_name` as `city_name` FROM `puppy_listings` INNER JOIN `puppy_users` ON `puppy_users`.id=`puppy_listings`.owner INNER JOIN `puppy_dogtypes` ON `puppy_dogtypes`.id=`puppy_listings`.type INNER JOIN `geo_countries` ON `geo_countries`.`country_id`= `puppy_listings`.`country_id` INNER JOIN `geo_cities` ON `geo_cities`.`city_id`= `puppy_listings`.`city_id` WHERE `puppy_listings`.`state`!='closed' AND `puppy_listings`.`time`+86400*IF(`puppy_users`.paytipe <> '',IF(`puppy_users`.paytipe='gold',14,21),7) > UNIX_TIMESTAMP(NOW()) AND `puppy_listings`.`price`>=500 ORDER BY `time` DESC LIMIT 3


    SELECT `puppy_users`.paytipe AS account_type, `puppy_users`.`type` AS user_type,`puppy_listings`.*, ROUND(DATEDIFF(NOW(),FROM_UNIXTIME(`puppy_listings`.birthdate))/31) AS month_count, `puppy_users`.userdata AS owner_data, `puppy_dogtypes`.name AS typename, `geo_countries`.`country_name` as `country_name` , `geo_cities`.`city_name` as `city_name` FROM `puppy_listings` INNER JOIN `puppy_users` ON `puppy_users`.id=`puppy_listings`.owner INNER JOIN `puppy_dogtypes` ON `puppy_dogtypes`.id=`puppy_listings`.type INNER JOIN `geo_countries` ON `geo_countries`.`country_id`= `puppy_listings`.`country_id` INNER JOIN `geo_cities` ON `geo_cities`.`city_id`= `puppy_listings`.`city_id` WHERE `puppy_listings`.`state`!='closed' AND `puppy_listings`.`time`+86400*IF(`puppy_users`.paytipe <> '',IF(`puppy_users`.paytipe='gold',14,21),7) > UNIX_TIMESTAMP(NOW()) AND `puppy_listings`.`price`>=500 ORDER BY `time` DESC LIMIT 3

    так не видно что эти 8 строк занимает один запрос))))
    Сапожник без сапог
  • mario

    Сообщения: 6067 Репутация: N Группа: Джедаи

    Spritz 29 апреля 2009 г. 0:58, спустя 1 минуту 39 секунд



    сдела попровачку, что бы читать удобнее было.

    [//code]


    слабоват. учись студент.

    SELECT `puppy_users`.paytipe AS account_type, `puppy_users`.`type` AS user_type,`puppy_listings`.*, ROUND(DATEDIFF(NOW(),FROM_UNIXTIME(`puppy_listings`.birthdate))/31) AS month_count, `puppy_users`.userdata AS owner_data, `puppy_dogtypes`.name AS typename, `geo_countries`.`country_name` as `country_name` , `geo_cities`.`city_name` as `city_name` FROM `puppy_listings` INNER JOIN `puppy_users` ON `puppy_users`.id=`puppy_listings`.owner INNER JOIN `puppy_dogtypes` ON `puppy_dogtypes`.id=`puppy_listings`.type INNER JOIN `geo_countries` ON `geo_countries`.`country_id`= `puppy_listings`.`country_id` INNER JOIN `geo_cities` ON `geo_cities`.`city_id`= `puppy_listings`.`city_id` WHERE `puppy_listings`.`state`!='closed' AND `puppy_listings`.`time`+86400*IF(`puppy_users`.paytipe <> '',IF(`puppy_users`.paytipe='gold',14,21),7) > UNIX_TIMESTAMP(NOW()) AND `puppy_listings`.`price`>=500 ORDER BY `time` DESC LIMIT 3


    SELECT `puppy_users`.paytipe AS account_type, `puppy_users`.`type` AS user_type,`puppy_listings`.*, ROUND(DATEDIFF(NOW(),FROM_UNIXTIME(`puppy_listings`.birthdate))/31) AS month_count, `puppy_users`.userdata AS owner_data, `puppy_dogtypes`.name AS typename, `geo_countries`.`country_name` as `country_name` , `geo_cities`.`city_name` as `city_name` FROM `puppy_listings` INNER JOIN `puppy_users` ON `puppy_users`.id=`puppy_listings`.owner INNER JOIN `puppy_dogtypes` ON `puppy_dogtypes`.id=`puppy_listings`.type INNER JOIN `geo_countries` ON `geo_countries`.`country_id`= `puppy_listings`.`country_id` INNER JOIN `geo_cities` ON `geo_cities`.`city_id`= `puppy_listings`.`city_id` WHERE `puppy_listings`.`state`!='closed' AND `puppy_listings`.`time`+86400*IF(`puppy_users`.paytipe <> '',IF(`puppy_users`.paytipe='gold',14,21),7) > UNIX_TIMESTAMP(NOW()) AND `puppy_listings`.`price`>=500 ORDER BY `time` DESC LIMIT 3

    так не видно что эти 8 строк занимает один запрос))))

    я вот щас пытаюсь вникнуть в "это", и задаю себе вопрос "это дуд мне решил вынести мозг, или дал пищу для раздумия"? :DDD

Пожалуйста, авторизуйтесь, чтобы написать комментарий!