SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 05.03.2018 00:12:41

megavolt
Участник
Зарегистрирован: 04.03.2018
Сообщений: 8

LEFT JOIN вывод только одно значения из правой таблицы

Доброго времени суток. Если есть знающие которые могут подсказать, то у меня есть вопросик.

Для более простого объяснения сокращу поля таблицы.

Есть таблица  tovar в ней колонки (id,name)
И есть таблица foto в ней колонки (id,idtovar,url,gl)

В таблице foto существует не одна запись с одинаковым idtovar, колонка gl если имеет значение 1 то это главное фото товара, у всех записей с одинаковым idtovar - gl со значением  1  встретится может только один раз а может и не встретится вообще.

К примеру:
tovar(id,name)
(1, название 1)
(2, название 2)
(3, название 3)
(4, название 4)
(5, название 5)

foto(id,idtovar,url,gl)
(1,2,url,2)
(2,2,url,2)
(3,4,url,1)
(4,4,url,2)
(5,4,url,2)

Как составить запрос, что бы выводилась только 1 запись к товару, если существует gl - 1 то вывестись должна она, если нет то любая.

Сейчас выводится примерно так при объединении:
tovar(id,name) foto(id,idtovar,url,gl)
(1, название 1) null
(2, название 2) (1,2,url,2)
(2, название 2)(2,2,url,2)
(3, название 3) null
(4, название 4) (3,4,url,1)
(4, название 4) (4,4,url,2)
(4, название 4) (5,4,url,2)
(5, название 5) null

А нужно:
(1, название 1) null
(2, название 2) (1,2,url,2)
(3, название 3) null
(4, название 4) (3,4,url,1)
(5, название 5) null


Запрос сейчас примерно такой:

("SELECT tovar*, foto* FROM tovar
            LEFT JOIN
            foto
            ON
            tovar.id = foto.idtovar
            WHERE
            ORDER BY tovar.id  DESC LIMIT 50
            ");


Заранее большое спасибо за помощь!

Неактивен

 

#2 05.03.2018 00:46:17

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: LEFT JOIN вывод только одно значения из правой таблицы

Создайте пример на sqlfiddle.com
, как например тут
http://sqlfiddle.com/#!9/a6c585/1
, чтобы были таблицы и набор тестовых данных, на их основе сделаем решение.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#3 05.03.2018 01:59:47

megavolt
Участник
Зарегистрирован: 04.03.2018
Сообщений: 8

Re: LEFT JOIN вывод только одно значения из правой таблицы

deadka написал:

Создайте пример на sqlfiddle.com
, как например тут
http://sqlfiddle.com/#!9/a6c585/1
, чтобы были таблицы и набор тестовых данных, на их основе сделаем решение.

Сайт этот не видел еще, но вроде что то вышло
http://sqlfiddle.com/#!9/423df53/22

Отредактированно megavolt (05.03.2018 01:59:58)

Неактивен

 

#4 05.03.2018 04:30:07

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

Re: LEFT JOIN вывод только одно значения из правой таблицы

http://sqlfiddle.com/#!9/423df53/47

SELECT a.id, a.name, b.id idfoto, b.idtovar, b.url, b.gl
FROM `tovar` a
LEFT JOIN (select t.* from
(select f1.* from `foto` f1 left join `foto` f2
on f1.`idtovar`=f2.`idtovar` and f1.gl>f2.gl
where f2.`idtovar` is null) t
left join `foto` f
on t.`idtovar`=f.`idtovar` and t.id>f.id
where f.`idtovar` is null
) b
    ON a.id = b.idtovar
     ORDER BY a.id
    ;

foto группируем по idtovar и берем запись с минимальным gl, и второй раз среди найденных с минимальным id.
Подробнее см Группировка в MySQL, 4-ый способ.

Неактивен

 

#5 05.03.2018 12:09:31

megavolt
Участник
Зарегистрирован: 04.03.2018
Сообщений: 8

Re: LEFT JOIN вывод только одно значения из правой таблицы

Большое спасибо за ответ и за пример

Какой сложный запрос.
Даже, не разберусь пока что как он работает.
и вот совсем не пойму как при выборке работает  is null  - без него работает не правильно выбирается только одно фото к товару, но что он говорит тогда?
f.`idtovar` is null - вроде выбор по idtovar

Неактивен

 

#6 05.03.2018 12:16:45

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

Re: LEFT JOIN вывод только одно значения из правой таблицы

Вы объяснение в статье смотрели? (я вряд ли смогу расписать понятней)

выполните

select * from `foto` f1 left join `foto` f2
on f1.`idtovar`=f2.`idtovar` and f1.gl>f2.gl

будет наглядно почему стоит добавить условие where f2.`idtovar` is null

Неактивен

 

#7 05.03.2018 12:30:13

megavolt
Участник
Зарегистрирован: 04.03.2018
Сообщений: 8

Re: LEFT JOIN вывод только одно значения из правой таблицы


SELECT a.id, a.name, b.id idfoto, b.idtovar, b.url, b.gl
FROM `tovar` a
LEFT JOIN (select t.* from
(select f1.* from `foto` f1 left join `foto` f2
on f1.`idtovar`=f2.`idtovar` and f1.gl>f2.gl) t
left join `foto` f
on t.`idtovar`=f.`idtovar` and t.id>f.id
where f.`idtovar` is null
) b
    ON a.id = b.idtovar
     ORDER BY a.id
    ;
 


Попробовал, все тоже самое выводится.
Статью прочитал, но как то толком все равно не понял(

Неактивен

 

#8 05.03.2018 12:39:50

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

Re: LEFT JOIN вывод только одно значения из правой таблицы

я имел в виду выполнить только

select * from `foto` f1 left join `foto` f2
on f1.`idtovar`=f2.`idtovar` and f1.gl>f2.gl


http://sqlfiddle.com/#!9/423df53/63

видно что для `idtovar` = 4 есть 3 строки
у строки с минимальным gl (gl=1) f2.`idtovar` = null

Неактивен

 

#9 05.03.2018 22:13:16

megavolt
Участник
Зарегистрирован: 04.03.2018
Сообщений: 8

Re: LEFT JOIN вывод только одно значения из правой таблицы

Немного расширил то что делали выше.

Добавил категории к товарам.

Вывести все товары одной категории, не составляет труда.

Но вот решил создать характеристики товара и опять у меня все запуталось.

Как мне теперь вывести товары которые имеют цвет: зеленый и форму: квадрат

В таблицах сделал так:

`harname` (`id`,`name`,`value`)

`name` - это название характиристики, a `value` - это свойство характеристики

Вторая собственно в ней присваиваю к ид товару ид характеристики
`harakter` (`id`,`idtovar`,`idharname`)


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

Ниже ссылка со всем этим

http://sqlfiddle.com/#!9/5507f2/2

Заранее большое спасибо

Отредактированно megavolt (05.03.2018 22:15:20)

Неактивен

 

#10 05.03.2018 22:28:17

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

Re: LEFT JOIN вывод только одно значения из правой таблицы

Неактивен

 

#11 06.03.2018 03:30:55

megavolt
Участник
Зарегистрирован: 04.03.2018
Сообщений: 8

Re: LEFT JOIN вывод только одно значения из правой таблицы

vasya написал:

https://sqlinfo.ru/forum/viewtopic.php?id=5324

Спасибо.

Вроде бы получилось, но не совсем то.

Зеленый у меня товар под ид 2 и 1
Квадрат у меня товар под ид 3 и 2

Собственно должны показаться товары с ид

1,2,3 а показывается только под ид 2 и 3.
Думал что запрос в той теме что ссылку давали удовлетворяет запросы только по всем значением из массива, но если ищу, что то под одним значением, то ли зеленый, то ли квадрат вообще не чего не показывает.

http://sqlfiddle.com/#!9/a12e51/29

Отредактированно megavolt (06.03.2018 03:31:26)

Неактивен

 

#12 06.03.2018 03:52:54

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

Re: LEFT JOIN вывод только одно значения из правой таблицы

http://sqlfiddle.com/#!9/a12e51/51

select * from `harakter` as t1 join
`harname` as t2 on t1.idharname=t2.id2
where value in ('Зеленый','Квадрат')
group by t1.idharname having count(*)=2
 


показывает только товар id=2, как и должно быть, т.к. только он удовлетворяет обоим значениям.

Неактивен

 

#13 06.03.2018 04:18:33

megavolt
Участник
Зарегистрирован: 04.03.2018
Сообщений: 8

Re: LEFT JOIN вывод только одно значения из правой таблицы

А для одного значения почему не чего не выводит?
http://sqlfiddle.com/#!9/a12e51/96


Я получается не правильно выразился

написал:

Как мне теперь вывести товары которые имеют цвет: зеленый и форму: квадрат

А надо было:
Как мне теперь вывести товары которые имеют цвет: зеленый ИЛИ форму: квадрат

Неактивен

 

#14 06.03.2018 11:55:45

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

Re: LEFT JOIN вывод только одно значения из правой таблицы

megavolt написал:

Как мне теперь вывести товары которые имеют цвет: зеленый ИЛИ форму: квадрат

select idtovar from `harakter` as t1 join
`harname` as t2 on t1.idharname=t2.id2
where value in ('Зеленый','Квадрат')
group by idtovar

Неактивен

 

#15 11.03.2018 20:44:25

megavolt
Участник
Зарегистрирован: 04.03.2018
Сообщений: 8

Re: LEFT JOIN вывод только одно значения из правой таблицы

Доброго времени суток. Снова проблемка у меня.
При выводе разделов характеристик (Цвет, Форма) и их свойств (Красный, Зеленый, Синий, Квадрат,Прямоугольник)
Хотел посчитать количество товаров для каждого свойства.
Собственно посчитать получилось, но не так как нужно, нужно посчитать только те товары которые относятся к  категории под id 3

Куда вписать и как не могу понять и прошу помочь(

http://sqlfiddle.com/#!9/ba39ac/1

Большое спасибо, за помощь то что была до этого. И заранее благодарю за помощь в данном вопросе.

Неактивен

 

#16 11.03.2018 23:58:07

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

Re: LEFT JOIN вывод только одно значения из правой таблицы

если я правильно понял, то

..
left JOIN (select idharname, count(*)
            from `haraktertov` join `tovar` on idtovar=tovar.id
            where `cat` = 3 group by idharname ) gf
on s.id = gf.idharname
..

Неактивен

 

Board footer

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