SQL Запросы из АДА

Roosso

Новичок
Вот довелось тут покодить один проект. В силу архитектуры БД, пришлось создать SQL запрос...
Оцените ;)
PHP:
	$q = $db->query("SELECT cg.cat_id, cg.cid, cg.owner_id, cg.top, MAX(cg.top) AS mytop,
							c.title as ctitle, c.logo, c.city as ccity, c.phone as cphone, c.address as caddress, c.brief_desc as cbrief_desc, c.items as citems
							FROM ".TARGET_TABLE." AS cg
								LEFT JOIN ".COMPANY_TABLE." AS c ON (c.id = cg.cid)
							WHERE c.items != 0 {$gq} GROUP BY cg.cid 
							ORDER BY mytop DESC, cg.top DESC, cg.bill_day DESC, c.title ASC 
							LIMIT ".$db->from.",".$db->limit);
 

Roosso

Новичок
В принципе не самый АДовый запрос.
PHP:
	$q = $db->query("SELECT cg.gid, cg.cat_id, cg.cid, cg.owner_id, cg.top, 
							g.title, g.img1, g.buy, g.sale, g.brief_desc, g.price_retail as price, g.price_wholesale,
							c.title as ctitle, c.city as ccity, c.phone as cphone, c.address as caddress
							FROM ".CATGOODS_TABLE." AS cg
								LEFT JOIN ".GOODS_TABLE." AS g ON (g.id = cg.gid)
								LEFT JOIN ".COMPANY_TABLE." AS c ON (c.id = cg.cid)
							WHERE g.id != 0 {$gq}
							ORDER BY cg.top DESC, cg.bill_day DESC, price ASC, g.title ASC
							LIMIT ".$db->from.",".$db->limit);
 

AmdY

Пью пиво
Команда форума
Ну, у вас ещё ерунда. вот пример не самого страшного запроса у нас.
PHP:
SELECT tasks.id, tasks.name, LTRIM(RTRIM(NVL(jt0.first_name,'')||' '||NVL(jt0.last_name,''))) assigned_user_name, tasks.assigned_user_id, jt0.created_by assigned_user_name_owner, 'Users' assigned_user_name_mod, tasks.date_due AS date_start, tasks.status, LTRIM(RTRIM(NVL(contacts.first_name,'')||' '||NVL(contacts.last_name,''))) contact_name, tasks.contact_id, contacts.assigned_user_id contact_name_owner, 'Contacts' contact_name_mod, tasks.created_by, 'tasks' panel_name, ' ' ccms_level
FROM tasks
LEFT JOIN users jt0 ON tasks.assigned_user_id=jt0.id AND jt0.deleted=0 AND jt0.deleted=0
LEFT JOIN contacts contacts ON tasks.contact_id=contacts.id AND contacts.deleted=0 AND contacts.deleted=0
INNER JOIN contacts tasks_rel ON tasks.contact_id=tasks_rel.id AND tasks_rel.deleted=0
WHERE (tasks.contact_id='be7f843f-f4dd-1107-7a02-4fba1d2d3da2' AND (tasks.status != 'Completed' AND tasks.status != 'Deferred')) AND tasks.deleted=0) UNION ALL (
SELECT tasks.id, tasks.name, LTRIM(RTRIM(NVL(jt0.first_name,'')||' '||NVL(jt0.last_name,''))) assigned_user_name, tasks.assigned_user_id, jt0.created_by assigned_user_name_owner, 'Users' assigned_user_name_mod, tasks.date_due AS date_start, tasks.status, LTRIM(RTRIM(NVL(contacts.first_name,'')||' '||NVL(contacts.last_name,''))) contact_name, tasks.contact_id, contacts.assigned_user_id contact_name_owner, 'Contacts' contact_name_mod, tasks.created_by, 'tasks_parent' panel_name, ' ' ccms_level
FROM tasks
LEFT JOIN users jt0 ON tasks.assigned_user_id=jt0.id AND jt0.deleted=0 AND jt0.deleted=0
LEFT JOIN contacts contacts ON tasks.contact_id=contacts.id AND contacts.deleted=0 AND contacts.deleted=0
INNER JOIN contacts tasks_parent_rel ON tasks.parent_id=tasks_parent_rel.id AND tasks_parent_rel.deleted=0 AND tasks.parent_type = 'Contacts'
WHERE (tasks.parent_id='be7f843f-f4dd-1107-7a02-4fba1d2d3da2' AND (tasks.status != 'Completed' AND tasks.status != 'Deferred')) AND tasks.deleted=0) UNION ALL (
SELECT meetings.id, meetings.name, LTRIM(RTRIM(NVL(jt0.first_name,'')||' '||NVL(jt0.last_name,''))) assigned_user_name, meetings.assigned_user_id, jt0.created_by assigned_user_name_owner, 'Users' assigned_user_name_mod, meetings.date_start, meetings.status, '                                                                                                                                                                                                                                                              ' contact_name, '                                    ' contact_id, ' ' contact_name_owner, ' ' contact_name_mod, meetings.created_by, 'meetings' panel_name, ' ' ccms_level
FROM meetings
LEFT JOIN users jt0 ON meetings.assigned_user_id=jt0.id AND jt0.deleted=0 AND jt0.deleted=0
INNER JOIN meetings_contacts ON meetings.id=meetings_contacts.meeting_id AND meetings_contacts.contact_id='be7f843f-f4dd-1107-7a02-4fba1d2d3da2' AND meetings_contacts.deleted=0
WHERE ((meetings.status !='Held' AND meetings.status !='Not Held')) AND meetings.deleted=0) UNION ALL (
SELECT calls.id, calls.name, LTRIM(RTRIM(NVL(jt0.first_name,'')||' '||NVL(jt0.last_name,''))) assigned_user_name, calls.assigned_user_id, jt0.created_by assigned_user_name_owner, 'Users' assigned_user_name_mod, calls.date_start, calls.status, '                                                                                                                                                                                                                                                              ' contact_name, '                                    ' contact_id, ' ' contact_name_owner, ' ' contact_name_mod, calls.created_by, 'calls' panel_name, calls.ccms_level
FROM calls
LEFT JOIN users jt0 ON calls.assigned_user_id=jt0.id AND jt0.deleted=0 AND jt0.deleted=0
INNER JOIN calls_contacts ON calls.id=calls_contacts.call_id AND calls_contacts.contact_id='be7f843f-f4dd-1107-7a02-4fba1d2d3da2' AND calls_contacts.deleted=0
WHERE ((calls.status != 'Held' AND calls.status != 'Not Held')) AND calls.deleted=0)
ORDER BY date_start DESC
 

Roosso

Новичок
Долбанный ад =) Полная жесть... )))
Я как то давно видел в каком то опенсорце запрос на 7 таблиц причем там конструкция была Select field (Select field From table Where field=filed) FROM table Where (Select ....) и в таком духе. Хотя я считаю что это не ад а фактически полный дурдом.
Но Ваш запросец.... мега ахтунг ))
А как у него с выполнением!? Он не убивает сервак?
 

AmdY

Пью пиво
Команда форума
да он не такой уж страшный как выглядит, мусора очень много после генератора получается.
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Хорошо что у меня нигде не сохранились оракловские отчеты SQL-ом на 4 экрана.
 

varan

Б̈́̈̽ͮͣ̈Л̩̲̮̻̤̹͓ДͦЖ̯̙̭̥̑͆А͇̠̱͓͇̾ͨД͙͈̰̳͈͛ͅ
у нас есть запрос с 26 join и фигзнает сколькими условиями.
 

alekciy

Новичок
Вот довелось тут покодить один проект. В силу архитектуры БД, пришлось создать SQL запрос...
Оцените ;)
флоппик дело говорит. Все эти ваши пугалки херня полная на фоне того, что можно найти в запросах к ораклу. Более адовых запросов чем там вроде бы ни где уже не найти.
 

fixxxer

К.О.
Партнер клуба
Не понимаю, чего такого в приведенных ТС запросах. Обычные запросы.

Или в наш век ORM-ов любой запрос сложнее select * from table where id=$id кажется сложным?
 

Absinthe

жожо
Согласен, запросы ТС - это обычные типичные простые запросы с 1-2 джойнами.
 

A1x

Новичок
типичный запросик из магенты
PHP:
SELECT
    `e`.*,
    `price_index`.`price`,
    `price_index`.`tax_class_id`,
    `price_index`.`final_price`,
    IF(price_index.tier_price IS NOT NULL, LEAST(price_index.min_price, price_index.tier_price), price_index.min_price) AS `minimal_price`,
    `price_index`.`min_price`,
    `price_index`.`max_price`,
    `price_index`.`tier_price`,
    `cat_index`.`position` AS `cat_index_position`,
    `links`.`link_id`, `link_attribute_position_int`.`value` AS `position`
FROM `catalog_product_entity` AS `e`
    INNER JOIN `catalog_product_index_price` AS `price_index`
        ON price_index.entity_id = e.entity_id
            AND price_index.website_id = '1'
            AND price_index.customer_group_id = 0
    INNER JOIN `catalog_category_product_index` AS `cat_index`
        ON cat_index.product_id=e.entity_id
            AND cat_index.store_id='1'
            AND cat_index.visibility IN(2, 4)
            AND cat_index.category_id='2'
    INNER JOIN `catalog_product_link` AS `links`
        ON links.linked_product_id = e.entity_id
            AND links.link_type_id = 1
    LEFT JOIN `catalog_product_link_attribute_int` AS `link_attribute_position_int`
        ON link_attribute_position_int.link_id = links.link_id
            AND link_attribute_position_int.product_link_attribute_id = '1'
WHERE (e.entity_id NOT IN((SELECT `sales_flat_quote_item`.`product_id` FROM `sales_flat_quote_item` WHERE (quote_id = '104'))))
    AND (links.product_id = 1)
    AND (`e`.`entity_id` != '1')
ORDER BY `e`.`entity_id` ASC
 

Absinthe

жожо
A1x а почему в ней часть наименований экранирована, а часть - нет?
Судя по всему, то, что в JOIN/WHERE, пишется руками, а остальное через какой-то statement-класс делается.
 

A1x

Новичок
Absinthe запрос генерируется ORM, что не исключает что какие-то части могут быть писаны руками
вообще там используется Zend_Db_Select
 

Absinthe

жожо
вообще там используется Zend_Db_Select
запрос генерируется ORM
Ну да, как я и думал про Zend_Db_Select, там все делается через всякие ->joinLeft, и руками пишутся условия.
В обычном ZF никаких ORM нету и там только билдер запросов Zend_Db_Select.
Судя по коду, ORM и тут не было, т.к. видно следы рук.
 

A1x

Новичок
да там свой ORM и он использует Zend_Db_Select как билдер запросов
 

Roosso

Новичок
Не понимаю, чего такого в приведенных ТС запросах. Обычные запросы.

Или в наш век ORM-ов любой запрос сложнее select * from table where id=$id кажется сложным?
Ну вообще то я стараюсь с БД работать по принципе меньше обращений и покороче запросы.
В целях скорости выполнения программ. Поэтому да... для меня такой запрос как я привел уже суров. Ибо мозга нагружает...

PS. Да я псих повернутый на файрволах и нагрузках.
Когда то давно, когда я начинал машины были слабенькими. Приходилось думать об использовании дисковой скорости, цп... Время прошло, а дурные привычки остались.
 

varan

Б̈́̈̽ͮͣ̈Л̩̲̮̻̤̹͓ДͦЖ̯̙̭̥̑͆А͇̠̱͓͇̾ͨД͙͈̰̳͈͛ͅ
для меня такой запрос как я привел уже суров. Ибо мозга нагружает...
Советую потренироваться в сложных запросах. Ибо на собеседованиях часто дают задания, например, на понимание join.
Ну типа, есть библиотека с книгами, у книг есть авторы, читатели берут книги почитать. Ну и надо спроектировать бд и написать хитрожопый запрос к ней, обычно с left join-ами
 

Adelf

Administrator
Команда форума
работал с ERP продуктом. видел запросы по тысяче строк. а хранимки были еще больше.
 
Сверху