Помогите с mysql join

12
J
На сайте с 08.06.2006
Offline
844
715

Было

select post_id,picture from z_admitad_product_data where post_id not in (select post_id from z_postmeta where meta_key ='_wp_attached_file') 

Переделал на

select z_admitad_product_data.* from z_admitad_product_data LEFT JOIN z_postmeta ON z_admitad_product_data.post_id = z_postmeta.post_id where z_postmeta.post_id IS NULL

Выдает пустой результат

MySQL вернула пустой результат (т.е. ноль строк). (запрос занял 0.3083 сек.)

п.с. и куда прилепить

meta_key ='_wp_attached_file'
не понимаю
Aisamiery
На сайте с 12.04.2015
Offline
293
#1

joost, Во первых, вы так не переделаете, первый запрос у вас находит посты, которые не имеют вложений, судя по именам

смущает where z_postmeta.post_id IS NULL Разве ID может быть NULL?

Я бы попробовал переделать на:


SELECT
z_admitad_product_data.*
FROM
z_admitad_product_data as apd
LEFT JOIN z_postmeta as pm ON
apd.post_id = pm.post_id
WHERE
pm.meta_key <> '_wp_attached_file'
Разработка проектов на Symfony, Laravel, 1C-Bitrix, UMI.CMS, OctoberCMS
J
На сайте с 08.06.2006
Offline
844
#2

Aisamiery, этого не может быть, но

Ответ MySQL: Документация

#1051 - Unknown table 'z_admitad_product_data'


---------- Добавлено 11.01.2017 в 12:12 ----------

а
select z_admitad_product_data.* from z_admitad_product_data LEFT JOIN z_postmeta ON z_admitad_product_data.post_id = z_postmeta.post_id where z_postmeta.meta_key <> '_wp_attached_file'

срабатывает не правильно

Aisamiery
На сайте с 12.04.2015
Offline
293
#3

joost, ну я не знаю вашей БД. Я сделал на основе вами предоставленных запросов, будучи уверенным что у вас есть данные таблицы :) Может не в ту БД вставляете?

J
На сайте с 08.06.2006
Offline
844
#4
Aisamiery:
смущает where z_postmeta.post_id IS NULL Разве ID может быть NULL?

Его может не быть (точнее записи с таким ид)

Aisamiery
На сайте с 12.04.2015
Offline
293
#5
joost:
Его может не быть (точнее записи с таким ид)

Такие записи не попадут в выборку. Если вам нужны только посты у которых есть post_id в z_postmeta и z_admitad_product_data (в обоих таблицах) вам вместо LEFT JOIN нужен INNER JOIN

То есть INNER JOIN вернет пересечение таблиц, LEFT JOIN вернет всю таблицу A (слева) и совпадение с таблицей B (правой), RIGHT JOIN соответственно наоборот

J
На сайте с 08.06.2006
Offline
844
#6

Мне нужно из z_admitad_product_data выбрать post_id, для которых в z_postmeta нет записи с z_postmeta.meta_key = '_wp_attached_file'

для понимания и полной картины

-- Структура таблицы `z_postmeta`

--

CREATE TABLE IF NOT EXISTS `z_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=215785 ;

-- Структура таблицы `z_admitad_product_data`

--

CREATE TABLE IF NOT EXISTS `z_admitad_product_data` (
`post_id` int(11) NOT NULL,
`price` decimal(10,2) NOT NULL,
`old_price` decimal(10,2) DEFAULT NULL,
`picture` varchar(150) NOT NULL,
`vendor` varchar(150) NOT NULL,
`model` varchar(150) NOT NULL,
`id_item` bigint(11) NOT NULL,
`url` varchar(500) DEFAULT NULL,
`id` varchar(500) DEFAULT NULL,
`currencyId` varchar(6) DEFAULT NULL,
`offer_id` int(11) DEFAULT NULL,
`attr_all` text NOT NULL,
UNIQUE KEY `post_id` (`post_id`),
KEY `id_item` (`id_item`),
KEY `picture` (`picture`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


---------- Добавлено 11.01.2017 в 12:39 ----------

Aisamiery:
Такие записи не попадут в выборку. Если вам нужны только посты у которых есть post_id в z_postmeta и z_admitad_product_data (в обоих таблицах) вам вместо LEFT JOIN нужен INNER JOIN

То есть INNER JOIN вернет пересечение таблиц, LEFT JOIN вернет всю таблицу A (слева) и совпадение с таблицей B (правой), RIGHT JOIN соответственно наоборот

http://eddnet.org/?p=1580

предпоследний

Aisamiery
На сайте с 12.04.2015
Offline
293
#7

joost, Ну я вам и написал ответ, только он у вас не работает почему то)))


SELECT
apd.*
FROM
z_admitad_product_data as apd
JOIN z_postmeta as pm ON
apd.post_id = pm.post_id
WHERE
pm.meta_key <> '_wp_attached_file' OR
pm.meta_key IS NULL;

Вот по вашей схеме

danforth
На сайте с 18.12.2015
Offline
153
#8

Попробуйте так.


SELECT adm.post_id
FROM z_admitad_product_data AS adm
INNER JOIN z_postmeta AS zps
ON zps.post_id = adm.post_id
WHERE zps.meta_key != '_wp_attached_file' OR zps.meta_key IS NULL;

Aisamiery, как табы ставить через браузер?

Junior Web Developer
Aisamiery
На сайте с 12.04.2015
Offline
293
#9
danforth:
Aisamiery, как табы ставить через браузер?

4 раза нажать на пробел 😂

J
На сайте с 08.06.2006
Offline
844
#10

danforth, твой запрос с WHERE zps.meta_key != '_wp_attached_file' OR zps.meta_key IS NULL; и без выдает один и тот же результат

---------- Добавлено 11.01.2017 в 12:58 ----------

стоп!

вижу что-то не то в таблицах

отпишусь

---------- Добавлено 11.01.2017 в 13:04 ----------

а нет

все же записи попадающие под условие есть

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий