- Поисковые системы
- Практика оптимизации
- Трафик для сайтов
- Монетизация сайтов
- Сайтостроение
- Социальный Маркетинг
- Общение профессионалов
- Биржа и продажа
- Финансовые объявления
- Работа на постоянной основе
- Сайты - покупка, продажа
- Соцсети: страницы, группы, приложения
- Сайты без доменов
- Трафик, тизерная и баннерная реклама
- Продажа, оценка, регистрация доменов
- Ссылки - обмен, покупка, продажа
- Программы и скрипты
- Размещение статей
- Инфопродукты
- Прочие цифровые товары
- Работа и услуги для вебмастера
- Оптимизация, продвижение и аудит
- Ведение рекламных кампаний
- Услуги в области SMM
- Программирование
- Администрирование серверов и сайтов
- Прокси, ВПН, анонимайзеры, IP
- Платное обучение, вебинары
- Регистрация в каталогах
- Копирайтинг, переводы
- Дизайн
- Usability: консультации и аудит
- Изготовление сайтов
- Наполнение сайтов
- Прочие услуги
- Не про работу
Как удалить плохие SEO-ссылки и очистить ссылочную массу сайта
Применяем отклонение ссылок
Сервис Rookee
Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий
Есть запрос вида
SELECT t1.*,t3.value,t3.year FROM firms AS t1
LEFT JOIN address AS t2 ON t1.id = t2.item_id
LEFT JOIN price AS t3 ON t3.item_id = t1.id
WHERE t1.category_id = '25' and t3.year = '2018'
GROUP BY t1.id
ORDER BY `t3`.`value` DESC
Этот запрос строит таблицу цен по убывания в нужном регионе. Но задача выводить все фирмы региона (FROM firms WHERE t1.category_id = '25' ), даже те, для которых цены нет.
Т.е. нужно показывать те фирмы для которых есть значения t3.year = '2018'
и те - для которых вообще нет записей в price.
Думал, крутил - единственное что придумал - пройтись циклом по всей таблице firms и если в таблице price для t3.item_id = t1.id нет значения 2018 года - написать туда для этих t3.item_id = t1.id
year = 0
А запрос переписать так
SELECT t1.*,t3.value,t3.year FROM firms AS t1
LEFT JOIN address AS t2 ON t1.id = t2.item_id
LEFT JOIN price AS t3 ON t3.item_id = t1.id
WHERE t1.category_id = '26' and (t3.year = '2018' or t3.year = '0')
GROUP BY t1.id
ORDER BY `t3`.`value` DESC
Теперь все работает - в таблицу выводятся значения за 2018 год, а в самом низу таблицы - фирмы без цен.
Но какой-то говнокод. Может быть есть более элегантное решение?
Как сделать выборку WHERE t1.category_id = '25' and t3.year = '2018' + те фирмы для которых вообще цен нет?
и те - для которых вообще нет записей в price.
( t3.year = 2018 or t3.year is null)
---------- Добавлено 12.09.2019 в 12:58 ----------
edogs, это было первое что я попробовал, но дело в том что если в таблице t3 для фирмы нет цены - то там вообще нет записей для t3.item_id = t1.id
и or t3.year is null не работает вероятно потому что выше условие - LEFT JOIN price AS t3 ON t3.item_id = t1.id
---------- Добавлено 12.09.2019 в 13:05 ----------
( в группе t1.id окажется несколько t3.value строк,
этого не случится - там же еще сортировка по году, а для 1 года всегда одна цена
edogs, это было первое что я попробовал, но дело в том что если в таблице t3 для фирмы нет цены - то там вообще нет записей для t3.item_id = t1.id
и or t3.year is null не работает вероятно потому что выше условие - LEFT JOIN price AS t3 ON t3.item_id = t1.id
Не.
left join как раз и сделан, что бы левая таблица (в данном случае т1) была всегда, а из правой присоединялись бы значения только при выполнении условия лефт джоин. Результат уже фильтруется where и having.
Так что там что-то в другом месте пошло не так.
edogs, я понял почему не срабатывал как надо.
Во первых был мой мусор
year = 0
когда его убрал ваш вариант работал но выбирал не все значения.
Оказывается в выборку не попадают фирмы если у них нет цен за 2018 год но есть за како-то другой.
Пытаюсь понять как их теперь добавить в запрос
---------- Добавлено 12.09.2019 в 13:24 ----------
Все нашел решение
---------- Добавлено 12.09.2019 в 13:24 ----------
edogs, спасибо!
Все нашел решение
(t3.year = '2018' or t3.year is null or t3.year != '2018')
edogs, спасибо!
Решение-то так себе 😂
"Если год = 2018 или год не равен 2018 или год вообще отсутствует" - такое условие можно было бы и не писать, т.к. оно покрывает все варианты.
Казалось бы да - но на удивление по всем регионам стало работать как и нужно, я там еще на финальном этапе сортирую год - короче работает как нужно теперь :)
Казалось бы да - но на удивление по всем регионам стало работать как и нужно, я там еще на финальном этапе сортирую год - короче работает как нужно теперь :)
Вы убрали условие по году.
То есть теперь в т3.валуе у Вас может быть цена за любой год, т.к. фильтра по году нет.
В частности для фирмы у которой есть цена за 18 год - в выборке может оказаться цена за 15 год.
Год на финальном этапе бесполезно сортировать, т.к. он во-первых не связан с ценой при выборке в группе, а во-вторых опять же может оказаться любым.
Да, вы правы - не туда посмотрел... запутался уже, куча файлов открыта... думаю дальше..
---------- Добавлено 12.09.2019 в 14:24 ----------
мде.. без вариантов - только вариант с говнокодом что я изначально и придумал
value = 0
year = 0
Dram,
По уму Вам надо в таблицу фирм добавить поле в котором будет цена за последний год. И это будет не говнорешение, а вполне хорошее. Задавать можно одним запросом.
А одним запросом можете попробовать как-то так
max(concat_ws('.',t3.year,100*t3.value)) max3
FROM firms AS t1
LEFT JOIN address AS t2 ON t1.id = t2.item_id
LEFT JOIN price AS t3 ON t3.item_id = t1.id
WHERE t1.category_id = '25' and t3.year<=2018
GROUP BY t1.id
ORDER BY `t3`.`value` DESC
Результат смотреть в max3, разбирать на php
По уму Вам надо в таблицу фирм добавить поле в котором будет цена за последний год. И это будет не говнорешение, а вполне хорошее.
Если ума нет, то да, по уму. Раздувать таблицу, добавляя туда всё новые и новые поля, тем более, когда это уже рабочая таблица, а не проект в разработке - воистину гениальное решение.
P.S. А потом появляются такие вот темы.