2014-02-17 3 views
0

У меня есть сайт wordpress, и я должен использовать информацию во внешнем приложении через внешний скрипт.конкретный комплексный запрос mysql join

Им просто небольшие проблемы на один тузд вызов

У меня есть скидки, указанные в таблице wp_posts, а затем начальную и конечную дату в таблице wp_postmeta.

Однако я могу для жизни меня в одном MySQL Query выбрать все скидки, которые живут (т.е. между датами начала и окончания)

может кто-нибудь сказать мне, как к ней.

ниже у меня есть дамп с 4 примерами 2 должны быть возвращены (104745,104744) 1 старая скидка (104743) 1 пока не живут (104666)

большое спасибо

DROP TABLE IF EXISTS `wp_postmeta`; 
CREATE TABLE `wp_postmeta` (
    `meta_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, 
    `post_id` bigint(20) unsigned NOT NULL DEFAULT '0', 
    `meta_key` varchar(255) DEFAULT NULL, 
    `meta_value` longtext, 
    PRIMARY KEY (`meta_id`), 
    KEY `post_id` (`post_id`), 
    KEY `meta_key` (`meta_key`) 
) ENGINE=InnoDB AUTO_INCREMENT=459770 DEFAULT CHARSET=utf8; 


DROP TABLE IF EXISTS `wp_posts`; 
CREATE TABLE `wp_posts` (
    `ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT, 
    `post_author` bigint(20) unsigned NOT NULL DEFAULT '0', 
    `post_date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', 
    `post_date_gmt` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', 
    `post_content` longtext NOT NULL, 
    `post_title` text NOT NULL, 
    `post_excerpt` text NOT NULL, 
    `post_status` varchar(20) NOT NULL DEFAULT 'publish', 
    `comment_status` varchar(20) NOT NULL DEFAULT 'open', 
    `ping_status` varchar(20) NOT NULL DEFAULT 'open', 
    `post_password` varchar(20) NOT NULL DEFAULT '', 
    `post_name` varchar(200) NOT NULL DEFAULT '', 
    `to_ping` text NOT NULL, 
    `pinged` text NOT NULL, 
    `post_modified` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', 
    `post_modified_gmt` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', 
    `post_content_filtered` longtext NOT NULL, 
    `post_parent` bigint(20) unsigned NOT NULL DEFAULT '0', 
    `guid` varchar(255) NOT NULL DEFAULT '', 
    `menu_order` int(11) NOT NULL DEFAULT '0', 
    `post_type` varchar(20) NOT NULL DEFAULT 'post', 
    `post_mime_type` varchar(100) NOT NULL DEFAULT '', 
    `comment_count` bigint(20) NOT NULL DEFAULT '0', 
    PRIMARY KEY (`ID`), 
    KEY `post_name` (`post_name`), 
    KEY `type_status_date` (`post_type`,`post_status`,`post_date`,`ID`), 
    KEY `post_parent` (`post_parent`), 
    KEY `post_author` (`post_author`) 
) ENGINE=InnoDB AUTO_INCREMENT=104855 DEFAULT CHARSET=utf8; 

INSERT INTO `wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES 
(104745, 0, '2014-02-15 00:00:00', '2014-02-15 00:00:00', '<div class=\"code-details\">\r\n<p class=\"code-description\"><span class=\"merchant-name\">Interflora</span> &pound;4 Off Orders over &pound;40 at Interflora T&C: Minimum product value of &pound;40 applies offer excludes overseas, giftcard and Interflora Gold purchases.</p>\r\n</div>', '&pound;4 Off Orders over &pound;40 at Interflora T&C: Minimum product value of &pound;40 applies offer excludes overseas, giftcard and Interflora Gold purchases.', '', 'publish', 'closed', 'closed', '', '4-off-orders-over-40-at-interflora-t40-applies-%c2%96-offer-excludes-overseas-giftcard-and-interflora-gold-purchases', '', '', '2014-02-17 16:01:36', '2014-02-17 16:01:36', '', 0, 'http://www.site.com/discount-codes/4-off-orders-over-40-at-interflora-t40-applies-%c2%96-offer-excludes-overseas-giftcard-and-interflora-gold-purchases/', 0, 'discount_codes', '', 0), 
(104744, 0, '2014-02-17 00:00:00', '2014-02-17 00:00:00', '<div class=\"code-details\">\r\n<p class=\"code-description\"><span class=\"merchant-name\">Interflora</span> 10% Off All Hampers over &pound;25 at Interflora T&C: Minimum product value of &pound;24.99 applies offer excludes overseas, giftcard and Interflora Gold purchases.</p>\r\n</div>', '10% Off All Hampers over &pound;25 at Interflora T&C: Minimum product value of &pound;24.99 applies offer excludes overseas, giftcard and Interflora Gold purchases.', '', 'publish', 'closed', 'closed', '', '10-off-all-hampers-over-25-at-interflora-t24-99-applies-%c2%96-offer-excludes-overseas-giftcard-and-interflora-gold-purchases', '', '', '2014-02-17 16:01:34', '2014-02-17 16:01:34', '', 0, 'http://www.site.com/discount-codes/10-off-all-hampers-over-25-at-interflora-t24-99-applies-%c2%96-offer-excludes-overseas-giftcard-and-interflora-gold-purchases/', 0, 'discount_codes', '', 0), 
(104743, 0, '2014-02-15 00:00:00', '2014-02-15 00:00:00', '<div class=\"code-details\">\r\n<p class=\"code-description\"><span class=\"merchant-name\">Interflora</span> 10% Off the Spring Flowers Collection at Interflora (Min Spend &pound;30) T&C: Minimum product value of &pound;30.00 applies offer excludes overseas, giftcard and Interflora Gold purchases.</p>\r\n</div>', '10% Off the Spring Flowers Collection at Interflora (Min Spend &pound;30) T&C: Minimum product value of &pound;30.00 applies offer excludes overseas, giftcard and Interflora Gold purchases.', '', 'publish', 'closed', 'closed', '', '10-off-the-spring-flowers-collection-at-interflora-min-spend-30-t30-00-applies-%c2%96-offer-excludes-overseas-giftcard-and-interflora-gold-purchases', '', '', '2014-02-17 16:01:33', '2014-02-17 16:01:33', '', 0, 'http://www.site.com/discount-codes/10-off-the-spring-flowers-collection-at-interflora-min-spend-30-t30-00-applies-%c2%96-offer-excludes-overseas-giftcard-and-interflora-gold-purchases/', 0, 'discount_codes', '', 0), 
(104666, 0, '2014-02-17 00:00:00', '2014-02-17 00:00:00', '<div class=\"code-details\">\r\n<p class=\"code-description\"><span class=\"merchant-name\">Marks and Spencer</span> 20% off Outlet (does not include the BOGOHP offers)</p>\r\n</div>', '20% off Outlet (does not include the BOGOHP offers)', '', 'publish', 'closed', 'closed', '', '20-off-outlet-does-not-include-the-bogohp-offers', '', '', '2014-02-17 16:01:50', '2014-02-17 16:01:50', '', 0, 'http://www.site.com/discount-codes/20-off-outlet-does-not-include-the-bogohp-offers/', 0, 'discount_codes', 




INSERT INTO `wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES 
(459207, 104743, 'discount_code_merchant_name', 'Interflora'), 
(459208, 104743, 'discount_code', 'SPINGFLO'), 
(459209, 104743, 'discount_code_url', 'd.php?v=1969&amp;t=141617&amp;p=http://www.interflora.co.uk/category/spring-flowers'), 
(459210, 104743, 'discount_code_start_date', '2014-02-05 00:00:00'), 
(459211, 104743, 'discount_code_end_date', '2014-02-08 23:59:59'), 
(459212, 104743, '_wp_page_template', 'default’), 


(459213, 104744, 'discount_code_merchant_name', 'Interflora'), 
(459214, 104744, 'discount_code', 'HAMPER'), 
(459215, 104744, 'discount_code_url', 'd.php?v=1969&amp;t=141617&amp;p=http://www.interflora.co.uk/category/hampers-gifts/'), 
(459216, 104744, 'discount_code_start_date', '2014-02-17 00:00:00'), 
(459217, 104744, 'discount_code_end_date', '2014-02-23 23:59:59'), 
(459218, 104744, '_wp_page_template', 'default'), 
(459225, 104745, 'discount_code_merchant_name', 'Interflora'), 
(459226, 104745, 'discount_code', 'SPRING4IT'), 
(459227, 104745, 'discount_code_url', 'd.php?v=1969&amp;t=141617&amp;p=http://www.interflora.co.uk/'), 
(459228, 104745, 'discount_code_start_date', '2014-02-15 00:00:00'), 
(459229, 104745, 'discount_code_end_date', '2014-02-28 23:59:59'), 
(459230, 104745, '_wp_page_template', 'default’), 


(459285, 104666, 'discount_code_merchant_name', 'Marks and Spencer'), 
(459286, 104666, 'discount_code', 'N/A'), 
(459287, 104666, 'discount_code_url', 'd.php?v=1402&amp;t=141617&amp;p=http://outlet.marksandspencer.com/'), 
(459288, 104666, 'discount_code_start_date', '2014-03-17 00:00:00'), 
(459289, 104666, 'discount_code_end_date', '2014-03-18 23:59:59'), 
(459290, 104666, '_wp_page_template', 'default’); 
+0

Его лучше добавить ваши определения таблиц на http://sqlfiddle.com/, а не добавлять все запросы в вопрос –

ответ

1

Вы дали нам немного обратной инженерии!

Что вам нужно, я думаю, в pseudosql, является

SELECT id 
    FROM discount_codes 
    WHERE discount_code_start_date < NOW() 
    AND discount_code_end_date > NOW() 

Это будет удар назад список идентификаторов почтовых для дисконтных кодов, которые начали, но не закончился.

Итак, трюк заключается в том, чтобы каким-то образом заставить схему WordPress дать вам этот результат. Как обычно, это весело, чтобы понять это.

Вот что вы делаете. Вам нужно получить значения идентификаторов записей wp_posts, которые являются активными кодами скидок. Это достаточно просто.

SELECT id 
    FROM wp_posts 
WHERE post_type = 'discount_codes' 
    AND post_status = 'publish 

Далее вам нужно получить полезные пункты post_meta. Те принимают подзапросы, чтобы делать правильно.

SELECT post_id AS id, 
     CAST(meta_value AS DATETIME) AS discount_code_start_date 
    FROM post_meta 
WHERE meta_key = 'discount_code_start_date' 

Аналогичным образом, это необходимо для даты окончания.

SELECT post_id AS id, 
     CAST(meta_value AS DATETIME) AS discount_code_end_date 
    FROM post_meta 
WHERE meta_key = 'discount_code_end_date' 

Тогда вам нужно объединить все это вместе и применить правильные предложения WHERE.

SELECT p.id 
    FROM wp_posts AS p 
    JOIN (
     SELECT post_id AS id, 
       CAST(meta_value AS DATETIME) AS discount_code_start_date 
     FROM post_meta 
     WHERE meta_key = 'discount_code_start_date' 
     ) AS s ON (p.id = s.id) 
    JOIN (
     SELECT post_id AS id, 
      CAST(meta_value AS DATETIME) AS discount_code_end_date 
     FROM post_meta 
     WHERE meta_key = 'discount_code_end_date' 
     ) AS e ON (p.id = e.id) 
WHERE p.post_type = 'discount_codes' 
    AND p.post_status = 'publish' 
    AND s.discount_code_start_date < NOW() 
    AND e.discount_code_end_date > NOW() 

Секрет использования таблицы post_meta правильно лежит в подзапросах, которые тянут строки с соответствующими значениями meta_key.

+0

блестящий - очень краткий - много спасибо – user1745467

Смежные вопросы