[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Опять про сложную выборку из БД
m4a1fox
Добрый, уже вечер уважаемые эксперты. Вот, уже потихоньку пытаюсь изучать сложные запросы, но не всегда получается. И вот столкнулся с проблемкой. Есть вот такая выборка
$num_w = "40";
$query = mysql_query("SELECT a.`id`, a.`title`, a.`date`,
SUBSTRING_INDEX(a.`text`,' ',"
. $num_w . ") AS `text`,
a.`time`, a.`view`, a.`hide`,
COUNT(b.`id_mail`) AS `id_mail_comment`
FROM `you_mail` a
LEFT JOIN `comment` b
ON a.`id` = b.`id_mail`
GROUP BY a.`id`
WHERE a.`hide`= 'show'
ORDER BY a.`id` DESC
LIMIT 5
"
) or die ("Ошибка -". mysql_error());


Все бы ничего, но вот только вот эта строчка
 WHERE a.`hide`= 'show'
все сбивает, если ее убрать, то все работает, но мне необходимо это условие. Подскажите, как тут быть? Спасибо.



Спустя 6 минут, 21 секунда (22.03.2011 - 19:00) Snus написал(а):
Попробуй так, а то вероятно ты мог с пробелами занести данные.
WHERE a.`hide` LIKE  '%show%'

Спустя 1 минута, 44 секунды (22.03.2011 - 19:01) m4a1fox написал(а):
Snus
Не... пробелы ни как не получится. тут поле enum ('hide', 'show').

Спустя 1 минута, 23 секунды (22.03.2011 - 19:03) m4a1fox написал(а):
Snus
Неа, не проконало. Ошибка однако. Если интересно вот собственно сама ошибка
Ошибка -You have an error in your SQL syntax; check the manual that corresponds to your MySQL 
server version for the right syntax to
use near 'WHERE a.`hide` LIKE '%show%' ORDER BY a.`id` DESC '
at line 9

Вот такие пироги!

Спустя 14 минут, 42 секунды (22.03.2011 - 19:18) tomash написал(а):
GROUP BY после WHERE

Спустя 8 минут, 55 секунд (22.03.2011 - 19:26) m4a1fox написал(а):
tomash
Ха, сработало. Спасибо. Так же буру на заметку.

Спустя 2 минуты, 54 секунды (22.03.2011 - 19:29) m4a1fox написал(а):
tomash
Можно вдогонку еще вопрос. А из скольки таблиц можно вынимать данные, есть ли ограничения. Просто я в этот запрос хочу добавить еще 2 таблицы. Как думаете, реально ли?

Спустя 6 минут, 50 секунд (22.03.2011 - 19:36) Invis1ble написал(а):
реально

Спустя 26 секунд (22.03.2011 - 19:37) tomash написал(а):
Честно говоря не знаю есть ли ограничения на количество JOIN в запросе, но этим не стоит злоупотреблять, а плюс еще две таблицы, конечно, реально)

Спустя 2 минуты, 19 секунд (22.03.2011 - 19:39) m4a1fox написал(а):
tomash
Ага. Ясно. Буду эксперементировать. Но лучше объедененный запрос, чем еще 3 запроса после while первого?

Спустя 2 минуты, 42 секунды (22.03.2011 - 19:42) Invis1ble написал(а):
Я тоже не в курсе, насчет ограничений (думаю, они конечно же есть), но в реальной ситуации ты врядли превысишь лимит. Я видел запросы по 100 строк (JOIN'ы не считал, но по-моему их там не меньше пары десятков было) и они работают smile.gif

Спустя 55 секунд (22.03.2011 - 19:43) tomash написал(а):
В цикле тоже лучше запросов избегать. Почитайте про оператор IN (SQL)

Спустя 25 секунд (22.03.2011 - 19:43) m4a1fox написал(а):
И еще вопрос. (простите за наглость). LEFT JOIN только один раз прописывается, а потом через запятую перечисляются таблицы, или каждое новое обращение к БД это новый LEFT JOIN? Просто никогда не делал сложных запросов...

Спустя 8 секунд (22.03.2011 - 19:43) Invis1ble написал(а):
Цитата
Но лучше объедененный запрос, чем еще 3 запроса после while первого?

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

Спустя 57 секунд (22.03.2011 - 19:44) m4a1fox написал(а):
tomash
Понял. Сейчас почитаю:) У меня и книжка под рукой есть Анатолия Мотева.

Спустя 3 минуты, 2 секунды (22.03.2011 - 19:47) m4a1fox написал(а):
Знаете, я только что реально оценил ситуацию, и понял, что лучше оставлю 2 запроса после первого while. Ну, это моя оценка, если не сложно может глянете код...

$query = mysql_query("SELECT a.`id`, a.`title`, a.`date`,
SUBSTRING_INDEX(a.`text`,' ',"
. $num_w . ") AS `text`,
a.`time`, a.`view`, a.`hide`,
COUNT(b.`id_mail`) AS `id_mail_comment`
FROM `you_mail` a
LEFT JOIN `comment` b
ON a.`id` = b.`id_mail`
WHERE a.`hide` = 'show'
GROUP BY a.`id`
ORDER BY a.`id` DESC
LIMIT
$start, $num
") or die ("Ошибка -". mysql_error());
while($ind=mysql_fetch_assoc($query))
{
$a = '/page_view_you_mail.php?view='.(int)$ind['id'].'';
$result_vote_up = mysql_query("SELECT COUNT(*) FROM `vote`
WHERE `link` = '"
.$a."' AND `vote_up` = 1
"
) or die ("Ошибка -".mysql_error());
$query_vote_up = mysql_result($result_vote_up, 0);

$result_vote_down = mysql_query("SELECT COUNT(*) FROM `vote`
WHERE `link` = '"
.$a."' AND `vote_down` = 1
"
) or die ("Ошибка -".mysql_error());
$query_vote_down = mysql_result($result_vote_down, 0);


Просто даже не представляю, как это вписать в один запрос :(

Спустя 2 минуты, 3 секунды (22.03.2011 - 19:49) tomash написал(а):
LEFT JOIN каждый раз пишите новый, а то недолго и запутаться

Спустя 2 минуты, 42 секунды (22.03.2011 - 19:52) m4a1fox написал(а):
tomash
Так дело в том, как условие просчитать...

Спустя 15 секунд (22.03.2011 - 19:52) tomash написал(а):
ужос))) я бы посоветовал изменить структуру БД, что бы избежать таких запросов.

Спустя 2 минуты, 55 секунд (22.03.2011 - 19:55) m4a1fox написал(а):
tomash
Ну почему. По сути, есть табл. с голосование. Строки в ней - id, ip, vote_up, vote_down, link. А потом вытаскивать по id статьи. Где id = link.

Спустя 6 минут, 42 секунды (22.03.2011 - 20:02) m4a1fox написал(а):
Ну все же не реально. Не получится определить $a.

Спустя 3 минуты, 44 секунды (22.03.2011 - 20:05) m4a1fox написал(а):
Разве что, можно в таблицу с заметками, добавить еще 2 поля. vote_up и vote_down. И при голосовании, заносить данные и в табл. vote, и в табл. data. В табл. data на каждое нажатие, делать +1 в тот или иной столбец. А проверять голосовавших уже по табл. vote с ip и link.

Спустя 3 минуты, 38 секунд (22.03.2011 - 20:09) tomash написал(а):
а можно посмотреть структуру? Чуть позже зайду посоветую может чего)

Спустя 1 минута, 43 секунды (22.03.2011 - 20:11) m4a1fox написал(а):
tomash
Я бы с удовольствием показал.... Но я на linux'е. И поставил чистые php5+mysql+apache2. Так что наверно ни как...

Спустя 1 минута, 45 секунд (22.03.2011 - 20:13) m4a1fox написал(а):
Сейчас скину:)

Спустя 30 секунд (22.03.2011 - 20:13) m4a1fox написал(а):
user posted image
Вот скрин.

Спустя 1 минута, 21 секунда (22.03.2011 - 20:14) m4a1fox написал(а):
А вот это структура таблицы vote user posted image

Спустя 45 минут, 54 секунды (22.03.2011 - 21:00) Invis1ble написал(а):
m4a1fox
sudo mysqldump -uroot -proot database > /home/user/backup.sql

Спустя 19 секунд (22.03.2011 - 21:01) m4a1fox написал(а):
Всем спасибо за подсказки. Сделал путем добавления еще 2 полей, и обновления в них результата путем +1 если есть голосование.... Еще раз всем спасибо.

Спустя 37 секунд (22.03.2011 - 21:01) m4a1fox написал(а):
Invis1ble
А?

Спустя 1 минута, 25 секунд (22.03.2011 - 21:03) Invis1ble написал(а):
m4a1fox
я тебе показал как дамп делается, дабы показать структуру БД

Спустя 24 минуты, 50 секунд (22.03.2011 - 21:27) m4a1fox написал(а):
Invis1ble
А. Ну я так и понял... Но уже справился. Спасибо. Пока что вопросов нет... но они появятся:)
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.