SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 13.05.2015 22:29:59

Xatter
Участник
Зарегистрирован: 08.05.2012
Сообщений: 7

Объединение и сравнение по условию

Доброго всем вечера.

Дано (пример):

1 таблица (test)

id    name    showe.....

2 таблица (test2)
id    id_object    showe.....

В таблице test колонка showe содержит значения от 1 до 3, к примеру 100 записей с showe 1
В таблице test2 колонка id_object содержит id объектов из 1й таблицы, в которой две записи:

id    id_object    showe
1    40            0
2    40            0

Что нужно? условием типа SELECT * FROM test ..... WHERE showe = 1
На выходе мы должны получить 98 объектов (во второй таблице добавлены два объекта которые надо учитывать).

Вся проблемма в том что нужно всё сделать в одном запросе, по его результатам формируется постраничный вывод и прочее.

Нужно получить общее значение showe если создана запись в таблицe test2, как я вижу на примере php кода:

$showe1; //Из 1й таблицы
$showe2; //Из 2й таблицы

if ($showe2 != NULL) {
$showe = $showe2;
}
else {
$showe = $showe1;
}

Итоговое условие: WHERE $showe = 1

Неактивен

 

#2 13.05.2015 23:02:47

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Объединение и сравнение по условию

не понятно что должно быть в итоге, можете привести пример тестовых данных из нескольких строчек для первой таблицы и второй и что должен вернуть запрос.

Неактивен

 

#3 13.05.2015 23:44:23

Xatter
Участник
Зарегистрирован: 08.05.2012
Сообщений: 7

Re: Объединение и сравнение по условию

В первой таблице, test1 три столбца:
1)id (AI)
2)name
3)showe

Условно в таблице 100 записей :
1 name1 showe=1
2 name2 showe=1
3 name3 showe=1
и.т.д.

Во второй таблице, test2 три столбца:
1) id
2) id_object
3) showe

Условно в ней 2 записи:
1 97 0 (id / id_object / showe)
2 98 0 (id / id_object / showe)

При выполнение запроса SELECT * FROM test1 WHERE showe = '1' в результате мы получим 100 строк, name1, name2....name100. Это понятно, условно в таблице test1 содержатся сообщения, в которых переменная SHOWE означает в нашем случае показывать объявления. В реале записей порядка 2,5 млн.

В 2й таблице как мы видим лежат id_object - id из первой таблицы и showe - который задаёт сам пользователь. Опять же упрощено для примера, в реальности там лежит куча дополнительной инфы типо айди пользователя и.т.д. В эту таблицу попадают те записи которые пользователь скрыл, нажав кнопку.

Что в итоге нужно? Составить запрос к базе который выдаст в итоге 98 объявлений, а не 100 как в начале, потому что объявление с id 97 и 98 пользователь скрыл. Можно было бы фильтровать эти объекты на уровне php кода он этот вариант отпадает сразу. Используется поиск и сам запрос поисковой.

SELECT * FROM test1 t1 LEFT JOIN test2 t2 ON t1.id = t2.id_obj .... WHERE showe = 1 где в showe должна содержаться переменная из t2.showe если t1.id = t2.id_obj или (если такого id в таблице id_obj нет) принимать за основу t1.showe (из первой таблицы)

Или по такой формуле

showe1 - данные из 1й таблицы
showe2 - данные из 2й таблицы

if ($showe2 != NULL) //Если переменная showe2 не пустая
{
showe = showe2;           //showe - некая пустая переменная.... smile
}
else //Иначе, если переменная showe2 всё-таки пустая
{
showe = showe1 //Тогда присваиваем переменной showe данные из первой таблицы
}

И только после этого выполняем запрос типа:

SELECT * FROM test1 ТУТ МНОГО ВСЯКОГО КОДА WHERE showe = '1'

В итоге мы должны получить 98 объектов на выдаче так как две штуки скрыл для себя пользователь, все остальные пользователи получат выдачу в 100 объектов.

З.Ы. Какие значение в showe1 и showe2 мы не знаем, но первостепенным ориентиром для нас должна быть showe2 а второстепенным showe1

Неактивен

 

#4 14.05.2015 00:10:21

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Объединение и сравнение по условию

SELECT * FROM test1 t1 LEFT JOIN test2 t2 ON t1.id = t2.id_obj .... WHERE t1.showe = 1 AND (t2.showe=1 OR t2.showe is null)

Неактивен

 

#5 14.05.2015 13:35:38

Xatter
Участник
Зарегистрирован: 08.05.2012
Сообщений: 7

Re: Объединение и сравнение по условию

Благодарю вас за ответ, но всё равно не то. Создаём и заполняем таблицы:

CREATE TABLE IF NOT EXISTS `test1` (
`id` int(11) NOT NULL,
  `name` varchar(32) NOT NULL,
  `showe` int(11) NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=latin1;

--
-- Дамп данных таблицы `test1`
--

INSERT INTO `test1` (`id`, `name`, `showe`) VALUES
(1, 'name1', 0),
(2, 'name2', 0),
(3, 'name3', 0),
(4, 'name4', 1),
(5, 'name5', 1),
(6, 'name6', 1),
(7, 'name7', 1),
(8, 'name8', 1),
(9, 'name9', 1),
(10, 'name10', 1);

CREATE TABLE IF NOT EXISTS `test2` (
`id` int(11) NOT NULL,
  `id_obj` int(11) NOT NULL,
  `showe` int(11) NOT NULL,
  `user_id` int(11) NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1;

--
-- Дамп данных таблицы `test2`
--

INSERT INTO `test2` (`id`, `id_obj`, `showe`, `user_id`) VALUES
(1, 8, 0, 0),
(2, 9, 0, 0),
(3, 1, 1, 0);

При вашем запросе, результат правильный в том случае если t1.showe = 1, но логика всё равно не та.

Ваш запрос выдаёт результат, id колонок 4,5,6,7,10 но я добавил ещё одну запись в таблицу test2 (3, 1, 1, 0); в которой мы якобы помечаем что объект с id 1 помечен как showe 1, в таблице test1 у него showe = 0, а он должен учитываться,в итогде должно получитсяsadперечисляю id): 1,4,5,6,7,10. О чём я и писал выше, что если есть запись в таблице 2 то переменная showe должна быть равна showe из таблицы 2, некое общее showe по котому мы должны задать условие = 1 или =0 и.т.д.

Благодарю за понимание.

Отредактированно Xatter (14.05.2015 13:39:12)

Неактивен

 

#6 14.05.2015 15:22:20

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Объединение и сравнение по условию

вот теперь всё стало ясно:
WHERE
(t1.showe = 1 AND (t2.showe=1 OR t2.showe is null)) OR (t1.showe = 0 AND t2.showe = 1)


Правильно?

Неактивен

 

#7 14.05.2015 15:25:44

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Объединение и сравнение по условию

Точнее:
WHERE (t1.showe = 1 AND t2.showe is null) OR (t2.showe = 1)

Неактивен

 

#8 14.05.2015 15:36:07

Xatter
Участник
Зарегистрирован: 08.05.2012
Сообщений: 7

Re: Объединение и сравнение по условию

Идеально. Спасибо вам большое! Лучший форум!

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson