Задавайте вопросы, мы ответим
Вы не зашли.
Ясно, наверно тогда всетаки в итоге перечислю все поля, а что по поводу моих запросов?
И еще вопрос, я тут смотрю он ищет логин (я так понял) по всем пользователям, а там же вроде стоит UNIQUE KEY `login` (`login`(10)), или в этом случае индекс не используется? Это он получается каждый раз на всех страницах сайта, практически, будет сканировать всю базу пользователей? Может можно как-то этого избежать?
Неактивен
Debian написал:
Ясно, наверно тогда всетаки в итоге перечислю все поля, а что по поводу моих запросов?
Все нормально, разве что стоит условия на ограничения (типа `images`.`color` = '$sort') лучше писать в части WHERE. Но это вопрос стилистики.
Debian написал:
И еще вопрос, я тут смотрю он ищет логин (я так понял) по всем пользователям, а там же вроде стоит UNIQUE KEY `login` (`login`(10)), или в этом случае индекс не используется? Это он получается каждый раз на всех страницах сайта, практически, будет сканировать всю базу пользователей? Может можно как-то этого избежать?
Порядок объединения таблиц зависит от данных. В данном случае у вас в таблице пользователей всего 3 строчки, вот сервер и решил начать с неё
Неактивен
Ясненько Спасибочки
Неактивен
Помогите еще пожалуйста.
Вот запрос который вы делали, я тут внес не большие изменения:
Неактивен
1. В вашем запросе таблица категорий не нужна (если запрос вы привели полностью)
2. По нескольким словам можно сделать с помощью union и после общий limit. (или после каждого слова смотреть кол-во возращенных результатов и при необходимости делать запрос со следующим словом)
Неактивен
vasya написал:
1. В вашем запросе таблица категорий не нужна (если запрос вы привели полностью)
Так это вы запрос делали
vasya написал:
2. По нескольким словам можно сделать с помощью union и после общий limit. (или после каждого слова смотреть кол-во возращенных результатов и при необходимости делать запрос со следующим словом)
Я просто не умею пока пользоваться union, пока ответа ждал, начал пробовать сам, вот до чего пока дошел, но оно не много не так работает как хотелось бы, оно сортирует слова по алфавиту, а нужно в той последовательности в которой они перечислены в IN().
Отредактированно Debian (17.08.2013 12:19:43)
Неактивен
Debian написал:
vasya написал:
1. В вашем запросе таблица категорий не нужна (если запрос вы привели полностью)
Так это вы запрос делали
Клевета. Найдите "10 отличий" с тем вариантом, что приводил я.
Debian написал:
Я просто не умею пока пользоваться union, пока ответа ждал, начал пробовать сам, вот до чего пока дошел, но оно не много не так работает как хотелось бы, оно сортирует слова по алфавиту, а нужно в той последовательности в которой они перечислены в IN().
Debian написал:
Это конечно далеко не то что я хочу получить, но приходится постепенно искать способы для выполнения этой задачи.
Почему не то? Зная нужные imade_id выбираете остальную информацию. Если будете делать одним запросом (добавляя к этому join), то нужно будет зафиксировать порядок объединения с помощью STRAIGHT_JOIN
Debian написал:
Приходится Вас вчера не было, а больше не кто в этом вопросе помогать не хочет
На форуме мало постоянных пользователей, отвечающих на вопросы, вы можете стать одним из них
Неактивен
Клевета. Найдите "10 отличий" с тем вариантом, что приводил я.
Да, яж сказал, что подправил его немного, вот ваш вариант:
"SELECT ... FROM images i JOIN (SELECT DISTINCT image_id FROM tags WHERE tag='$sort') t JOIN `categories` JOIN `users`
ON i.id=t.image_id AND `images`.`category_id` = `categories`.`id` AND `images`.`user_id` = `users`.`id`
ORDER BY if(category_id=5,1,2), i.id DESC LIMIT $start, $limit"
Вот мой, но уже для другой, но похожей задачи:
SELECT image_id, tag FROM tags WHERE tag IN('красивая', 'блондинка', 'зелень') ORDER BY FIELD (tag, 'красивая', 'блондинка', 'зелень') DESC LIMIT 3;
Про вот это
Почему не то? Зная нужные imade_id выбираете остальную информацию. Если будете делать одним запросом (добавляя к этому join), то нужно будет зафиксировать порядок объединения с помощью STRAIGHT_JOIN
Значит я все таки начал думать в верном направлении, я просто решил разбить задачу на несколько отдельных задач, и когда уже найду как решить отдельные части, попытаться все собрать в единый запрос. Вот это STRAIGHT_JOIN я тоже в первые вижу
На форуме мало постоянных пользователей, отвечающих на вопросы, вы можете стать одним из них
Та ну, куда, на вашем фоне я буду выглядеть полным лошариком Мне до вас, еще учиться и учиться, у меня именно по MySQL пока еще слабовато, нужно учить и учить, с HTML, CSS, PHP, регулярными выражениями, серверной частью, железо и программное обеспечение, у меня проблем нет, это я уже довольно хорошо освоил, и обычно в этих вопросах мне помощь не нужна, вот только MySQL, JavaScript нужно подтянуть.
Неактивен
Нашел, на 370 странице, книги которую начал вчера читать ) а я сейчас на 200 странице Это я бы только завтра или после завтра увидел это решение
Функцию FIELD() можно использовать для сортировки произвольного множества значений в любом порядке. Например, чтобы вывести записи таблицы driver_log для имен Henry, Suzi и Ben именно в таком порядке, выполните запрос:
Неактивен
Только тут нужно еще и как-то по image_id сортировать, потому что вот что выходит:
Неактивен
В этой же книги увидел что можно через запятую указывать ORDER BY. Наверно вот так нужно сделать?
Неактивен
Итого получается у нас вот как-то так:
Отредактированно Debian (17.08.2013 15:13:11)
Неактивен
Ох я тут и на мудрил Не знаю вроде работает, но я сомневаюсь, что я это сделал правильно, и еще не тестировал, на паре примеров сработало правильно.
Тоесть я получил нужные поля из таблицы images, при этом исключил из выборки, картинку с номером 19, потому, что именно по ее ключевым словам, ищутся похожие картинки, также указал, что они должны все иметь id категории 6, ну и отсортированы в обратном порядке. Посмотрите пожалуйста, мне кажется, что тут, что-то точно не так Первый раз в жизни составляю такой сложный и большой запрос
Отредактированно Debian (17.08.2013 15:58:38)
Неактивен
Немного переделал, так будет логичнее:
Неактивен
Все таки немного некорректно он работает, вот, посмотрите.
Отредактированно Debian (17.08.2013 16:53:33)
Неактивен
Может быть вот так? Вроде работает, но правильная ли реализация?
Отредактированно Debian (17.08.2013 17:52:17)
Неактивен
Еще немного улучшил, точнее упростил:
Неактивен
1. distinct нужно в подзапрос, так как дубликаты появляются именно там. А в текущем варианте вы их сначала объединяете с таблицей images и лишь потом удаляете. Итог один, но производительность разная.
2. Зачем в подзапросе выбирать поле tag?
3. Сортировку лучше в подзапрос. Тогда сортироваться будут строки меньшей длинны (только image_id вместо i.id, i.title, i.upload_date). В этом случае вместо join нужен straight_join, который объединяет таблицы в том порядке как они указаны в запросе (естественно, что таблицу images и подзапрос нужно поменять местами).
Неактивен
1. distinct нужно в подзапрос, так как дубликаты появляются именно там. А в текущем варианте вы их сначала объединяете с таблицей images и лишь потом удаляете. Итог один, но производительность разная.
Вы правы, исправил.
2. Зачем в подзапросе выбирать поле tag?
Тогда не будет работать вот эта часть, ведь в подзапросе не будет данных.
ORDER BY FIELD (t.tag, 'желтые', 'цветы', 'красивая', 'зелень').
Но если переписать как вы предлагаете в пункте номер 3, то наверно и не нужно
3. Сортировку лучше в подзапрос. Тогда сортироваться будут строки меньшей длинны (только image_id вместо i.id, i.title, i.upload_date). В этом случае вместо join нужен straight_join, который объединяет таблицы в том порядке как они указаны в запросе (естественно, что таблицу images и подзапрос нужно поменять местами).
А можете переписать запрос, так как это сделали бы вы? Пожалуйста!
Неактивен
Странно, но DISTINCT, в подзапросе не работает Смотрите сами! Может я конечно чего-то не понял, но факт.
Неактивен
Неактивен
Debian написал:
Странно, но DISTINCT, в подзапросе не работает Смотрите сами! Может я конечно чего-то не понял, но факт.
distinct - это аналог group by по всем выбираемым полям.
Неактивен
-- обратите внимание, что категория в этом случае должна быть продублирована к таблице тегов
Не понял!?
Неактивен
Если проверку на категорию делать после объединения, а ограничение на кол-во в подзапросе, то возможен вариант, что часть или все image_id выбранные в подхапросе относятся к другим категориям.
Неактивен
Как-то странно у вас ограничение category_id стоит, сложненький для моего понимания запрос, нужно еще читать и читать, и запрос не закончен или что я не пойму? Просто он не работает, и как раз в том месте где мне и не понятно, от куда в таблице tags, взялся category_id. Чего-то я не до понял.
Неактивен