|
|
|
| Всем привет
Возникла проблема, не могу что-то придумать запрос, как объединить записи в 2х таблицах
Первая таблица это основная таблица где есть ID, TITLE, CONTENT, DATE_ADD
Вторая таблица это расширенные поля которые хранят информацию о записи в первой таблице id, id_post, meta_value, meta_key
В первой таблице есть записи
ID | TITLE | CONTENT | DATE_ADD
1 | Запись 1 | Текст записи 1 | 15.11.2011
2 | Запись 2 | Текст записи 2 | 16.11.2011
3 | Запись 3 | Текст записи 3 | 17.11.2011
4 | Запись 4 | Текст записи 4 | 18.11.2011
5 | Запись 5 | Текст записи 5 | 19.11.2011
6 | Запись 6 | Текст записи 6 | 19.11.2011
Вторая таблица
id | id_post | meta_key | meta_value |
1 | 1 | autor | Иванов
2 | 1 | color | Зеленый
3 | 1 | size | XXL
4 | 1 | brand | LG
5 | 2 | autor | Петров
6 | 2 | color | Зеленый
7 | 2 | size | M
8 | 2 | brand | LG
9 | 3 | autor | Петров
10 | 3 | color | Синий
11 | 3 | size | XL
12 | 3 | brand | Asus
13 | 4 | autor | Петров
14 | 4 | color | Синий
15 | 4 | size | XL
16 | 4 | brand | Asus
Необходимо выбрать данные из первой табицы ID, TITLE, CONTENT и объединить их с записями во второй таблице по id_post и выбрать все значения, где meta_value = Зеленый и meta_key = color
т.е. чтобы запрос вернул результат:
ID | TITLE | CONTENT | DATE_ADD | autor | color | size | brand |
1 | Запись 1 | Текст записи 1 | 15.11.2011 | Иванов | Зеленый | XXL | LG |
2 | Запись 2 | Текст записи 2 | 16.11.2011 | Петров| Зеленый | M| LG |
Всем заранее спасибо | |
|
|
|
|
|
|
|
для: yura_040
(19.11.2011 в 15:25)
| | А нельзя ли получить куски дампов таблиц, чтобы можно было воспроизвести ситуацию локально и отладить запрос? | |
|
|
|
|
|
|
|
для: cheops
(19.11.2011 в 16:39)
| | Конечно можно )
--
-- Структура таблицы `wp_postmeta`
--
CREATE TABLE IF NOT EXISTS `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=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=13 ;
--
-- Дамп данных таблицы `wp_postmeta`
--
INSERT INTO `wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES
(1, 1, 'color', 'зеленый'),
(2, 1, 'autor', 'Иванов'),
(3, 1, 'size', 'L'),
(4, 1, 'brand', 'LG'),
(5, 2, 'color', 'зеленый'),
(6, 2, 'autor', 'Петров'),
(7, 2, 'size', 'XL'),
(8, 2, 'brand', 'Asus'),
(9, 3, 'color', 'синий'),
(10, 3, 'autor', 'Петров'),
(11, 3, 'size', 'XXXL'),
(12, 3, 'brand', 'Asus');
-- --------------------------------------------------------
--
-- Структура таблицы `wp_posts`
--
CREATE TABLE IF NOT EXISTS `wp_posts` (
`ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`post_content` longtext NOT NULL,
`post_title` text NOT NULL,
`post_status` varchar(20) NOT NULL DEFAULT 'publish',
`post_parent` bigint(20) unsigned NOT NULL DEFAULT '0',
`post_type` varchar(20) NOT NULL DEFAULT 'post',
PRIMARY KEY (`ID`),
KEY `type_status_date` (`post_type`,`post_status`,`ID`),
KEY `post_parent` (`post_parent`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=6 ;
--
-- Дамп данных таблицы `wp_posts`
--
INSERT INTO `wp_posts` (`ID`, `post_content`, `post_title`, `post_status`, `post_parent`, `post_type`) VALUES
(1, 'Описание записи', 'Заголовок записи', 'publish', 0, 'post'),
(2, 'Описание записи', 'Заголовок записи', 'publish', 0, 'post'),
(3, 'Описание записи', 'Заголовок записи', 'publish', 0, 'post'),
(4, 'Описание записи', 'Заголовок записи', 'publish', 0, 'post'),
(5, 'Описание записи', 'Заголовок записи', 'publish', 0, 'post');
|
Необходимо осуществить выбор, например где wp_postmeta.meta_value = "color" wp_postmeta.meta_key = "зеленый "
или где цвет зеленый и автор Петров.
Т.е. в wp_postmeta.meta_key может быть до 10 разных ключей для одной записи в wp_posts и в зависимости от необходимости осуществлять выбор по ключам и значениям или по ID | |
|
|
|
|
|
|
|
для: yura_040
(19.11.2011 в 18:10)
| | Придется использовать какие-то такие запросы
SELECT
p.ID AS ID,
p.post_content AS content,
p.post_title AS title,
a.meta_value AS autor,
c.meta_value AS color,
s.meta_value AS size,
b.meta_value AS brand
FROM
wp_posts AS p
LEFT JOIN
(SELECT * FROM wp_postmeta
WHERE meta_key = 'autor') AS a
ON
p.ID = a.post_id
LEFT JOIN
(SELECT * FROM wp_postmeta
WHERE meta_key = 'color') AS c
ON
p.ID = c.post_id
LEFT JOIN
(SELECT * FROM wp_postmeta
WHERE meta_key = 'size') AS s
ON
p.ID = s.post_id
LEFT JOIN
(SELECT * FROM wp_postmeta
WHERE meta_key = 'brand') AS b
ON
p.ID = b.post_id
|
| |
|
|
|
|
|
|
|
для: cheops
(19.11.2011 в 18:29)
| | Спасибо работает ))
Ваше решение намного лучше, чем извлекать одним запросом каждое значение meta_value и получить в результате 200 запросов к БД вместо одного )) | |
|
|
|
|