Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Как объединить умно записи в двух таблицах
 
 автор: yura_040   (19.11.2011 в 15:25)   письмо автору
 
 

Всем привет

Возникла проблема, не могу что-то придумать запрос, как объединить записи в 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 |

Всем заранее спасибо

  Ответить  
 
 автор: cheops   (19.11.2011 в 16:39)   письмо автору
 
   для: yura_040   (19.11.2011 в 15:25)
 

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

  Ответить  
 
 автор: yura_040   (19.11.2011 в 18:10)   письмо автору
 
   для: 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

  Ответить  
 
 автор: cheops   (19.11.2011 в 18:29)   письмо автору
 
   для: 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

  Ответить  
 
 автор: yura_040   (19.11.2011 в 18:38)   письмо автору
 
   для: cheops   (19.11.2011 в 18:29)
 

Спасибо работает ))

Ваше решение намного лучше, чем извлекать одним запросом каждое значение meta_value и получить в результате 200 запросов к БД вместо одного ))

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования