Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Условие для параметра WHERE 
:(
    Опции темы
dimcat
Дата 19.7.2008, 00:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 64
Регистрация: 15.5.2007

Репутация: нет
Всего: нет



Подскажите, пожалуйста, каким образом обойти такую вещь:

Код

SELECT field FROM table1
left join table2 on table2.id=table1.id
WHERE table2.user_id=1


Проблема в том, что соответствующей записи в table2 может и не быть... Соответственно, тогда запрос ничего не возвращает из-за поставленного WHERE... А нужно, чтобы результат был в любом случае. Но, как понимаете, если запись в table2 найдена, то user_id должен быть, который задан. 

Каким образом нужно поставить условие, чтобы выборка по user_id подключалась/не подключалась в зависимости от найденной/не найденной строки?

Это сообщение отредактировал(а) skyboy - 19.7.2008, 21:30
PM MAIL   Вверх
Feldmarschall
Дата 19.7.2008, 00:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


Профиль
Группа: Участник
Сообщений: 2641
Регистрация: 11.12.2007

Репутация: нет
Всего: 32



LEFT OUTER JOIN
PM   Вверх
bars80080
Дата 19.7.2008, 00:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 1
Всего: 315



ну что значит должен быть результат? ты его хочешь, чтобы тебе пхп написал: строк нет?
так сделай так:
Код

$r = mysql_query(' ... твой запрос ... ');
if(!empty($r)) $n = mysql_num_rows($r);
for($i = 0; $i < $n; $i++) { $s[$i] = mysql_fetch_array($r, MYSQL_ASSOC); }
if(empty($s)) echo 'записей не найдено';

PM MAIL WWW   Вверх
dimcat
Дата 19.7.2008, 08:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 64
Регистрация: 15.5.2007

Репутация: нет
Всего: нет



Feldmarschall, LEFT OUTER JOIN даёт в моём случае тот же эффект, что и left join.

bars80080, нет ты не понял...

Подробнее... Немного расширю код для наглядности...

Есть, к примеру таблица table1 с полями id и field и двумя записями id=1, field='value' и id=2, field='value2'
И есть таблица table2 с полями id, user_id, field2 и одной записью id=1, user_id=1, field2='value3'

Так вот мне нужно, чтобы в любом случае мой запрос возвращал две записи: получается, одна должна быть со значением value3, а другая просто с пустым значением

Код

SELECT table1.field, table2.field2 FROM table1
left join table2 on table2.id=table1.id
WHERE table2.user_id=1


Это сообщение отредактировал(а) skyboy - 19.7.2008, 21:30
PM MAIL   Вверх
skyboy
Дата 19.7.2008, 09:47 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 15
Всего: 260



хоть это и некорректно(вносить условие, относящееся к одной таблице в секцию ON), но такой вариант:
Код

SELECT table1.field, table2.field2 
FROM table2
LEFT JONI table1 
ON table2.id=table1.id AND table2.user_id=1

ещё я бы поинтересовался задачей. потому как лично у меня потребнось в подобных запросах если и возникала, то "решалась" дополнительной нормализацией струтуры БД.
PM MAIL   Вверх
Feldmarschall
Дата 19.7.2008, 10:17 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


Профиль
Группа: Участник
Сообщений: 2641
Регистрация: 11.12.2007

Репутация: нет
Всего: 32



ладно, послушаем задачу.
пусть автор хоть немного потрудится. а то все за него делать: 
сообразить, что вопрос никак к пхп не относится, и поместить в соответствующий раздел.
сообразить, что слова mysql_query ние относятся к SQL запросу, и писать их не надо.
сообразить, что поставленных в описании условий недостаточно, и что в таблице table2 не одна запись, а две. с user_id=1 и с user_id=2


Это сообщение отредактировал(а) Feldmarschall - 19.7.2008, 10:50
PM   Вверх
dimcat
Дата 19.7.2008, 12:50 (ссылка)    | (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 64
Регистрация: 15.5.2007

Репутация: нет
Всего: нет



Feldmarschall, если всё сказал, то пора бы сообразить, что это не тема не в том топике, а ты слегка не в теме... Если бы 
Цитата
в таблице table2 не одна запись, а две. с user_id=1 и с user_id=2
, то я бы никого не спрашивал и всё бы прекрасно работало. Отойди и не мешай.

skyboy,  задача такова... Делаю раздел для футбольных прогнозов. В одной таблице находятся непосредственно матчи для прогнозирования, в другой прогнозы пользователей. Дословно запрос вот:

Код

SELECT spt_prognos_matches.id id, champ, tour, date, home_id, spt_prognos_matches.home_score home_score, away_id,
 spt_prognos_matches.away_score away_score, end, c1.club_name club1, t1.town_name town1, c2.club_name club2, t2.town_name town2, 
spt_prognos_users.home_score home_score2, spt_prognos_users.away_score away_score2 FROM spt_prognos_matches
inner join spt_clubs c1 on spt_prognos_matches.home_id=c1.club_id
inner join spt_towns t1 on c1.town_id=t1.town_id
inner join spt_clubs c2 on spt_prognos_matches.away_id=c2.club_id
inner join spt_towns t2 on c2.town_id=t2.town_id
left outer join spt_prognos_users on spt_prognos_matches.id=spt_prognos_users.match_id
WHERE user_id=<идентификатор пользователя>
ORDER BY date DESC


Этот запрос должен выводить все матчи для прогнозирования + если уже есть прогнозы от данного пользователя, то указывать их (spt_clubs и spt_towns - всего лишь названия клубов и городов и к делу непосредственного отношения не имеют). Получается, что во второй таблице прогноз пользователя на игру может как присутствовать так и нет,  в зависимости от того, сделал ли он его...

Пример работы здесь - http://spartak.tambovsport.ru/main.php?middle=prognos/index . Как видите запрос выводит только три записи, на которые есть прогнозы пользователя, а должен выводить восемь, 5 из которых просто с пустыми полями для ввода (вместо $_SESSION['us_id'] в запрос временно вставил 1)...

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

Это сообщение отредактировал(а) skyboy - 19.7.2008, 21:32
PM MAIL   Вверх
Feldmarschall
Дата 19.7.2008, 13:31 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


Профиль
Группа: Участник
Сообщений: 2641
Регистрация: 11.12.2007

Репутация: нет
Всего: 32



Куда смотрит администрация. Опять хамят.
Не умеет задачу описать: под условие
Цитата(dimcat @  19.7.2008,  08:48 Найти цитируемый пост)
Есть, к примеру таблица table1 с полями id и field и двумя записями id=1, field='value' и id=2, field='value2'
И есть таблица table2 с полями id, user_id, field2 и одной записью id=1, user_id=1, field2='value3'

прекрасно подходит запрос 
Код

SELECT table1.field, table2.field2 FROM table1
left join table2 on table2.id=table1.id

А когда его поправляют - начинаются поучения. 
Сам не может отличить пхп от SQL и рекомендации более опытыных товарищей не слушает. Демонстративно продолжает использовать подсветку РНР.
Прошу принять меры.




PM   Вверх
Fortop
Дата 19.7.2008, 14:27 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 2
Всего: 42



Цитата(dimcat @  19.7.2008,  12:50 Найти цитируемый пост)
Как видите запрос выводит только три записи, на которые есть прогнозы пользователя, а должен выводить восемь, 5 из которых просто с пустыми полями для ввода

Тебе уже сказали LEFT OUTER JOIN.

Добавлено через 1 минуту и 26 секунд
Пора уже штрафы за глупость с гонором выписывать.


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
Feldmarschall
Дата 19.7.2008, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


Профиль
Группа: Участник
Сообщений: 2641
Регистрация: 11.12.2007

Репутация: нет
Всего: 32



Fortop, аутер-то аутер, но не просто, а по условию, которое написал skyboy, 
PM   Вверх
skyboy
Дата 19.7.2008, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 15
Всего: 260



dimcat, так скажи, решился вопрос или нет?
--
А теперь - нагоняй.
dimcat, ты не прав трижды.
1. если тебе делают замечание по существу, либо аргументировано возражай по существу, либо молчи. Рот никому затыкать не надо.
2. если у тебя вопрос о SQL-запросе, размещай тему не в разделе "РНР", а в разделе "Составление SQL-запросов" с указанием СУБД и её версии.
3. Опять же, если у тебя вопрос по SQL, то потрудись выбросить из кода РНР-конструкции и выбрать тип подсветки "SQL". В следующий раз делать это за тебя не буду.

M
skyboy
Тема перенесена из "РНР: Базы данных"

Цитата(Feldmarschall @  19.7.2008,  12:31 Найти цитируемый пост)
Куда смотрит администрация.

Иногда - отдыхает от трудовых будней.



PM MAIL   Вверх
Feldmarschall
Дата 19.7.2008, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


Профиль
Группа: Участник
Сообщений: 2641
Регистрация: 11.12.2007

Репутация: нет
Всего: 32



skyboy, я потестил - вроде, делает, что ему нужно.
PM   Вверх
dimcat
Дата 19.7.2008, 23:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 64
Регистрация: 15.5.2007

Репутация: нет
Всего: нет



Да, спасибо, работает.

skyboy, соглашусь по 2 и 3 пунктам обвинений smile
Не знал, что есть отдельный топ для БД, поэтому и поместил в PHP: БД.
Не видел выборки у поля с кодом.
Теперь знаю и вижу.

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

Feldmarschall, задачу описываю как умею. И не хамлю, а отвечаю тоном подобным твоим пафосным постам. 

Цитата
пусть автор хоть немного потрудится. а то все за него делать


1. Делать здесь что бы то ни было за кого бы то ни было насильно тебя никто не заставляет...
2. Ты понятия не имеешь о том, что, чем и сколько раз я делаю и много или немного я для этого тружусь.
3. Мне не нужно было, чтобы сделали за меня, а всего лишь подсказали способ.

Fortop, за твой пост кому штраф выписывать будем?

Как бы там ни было, ещё раз спасибо. На самом деле не знал, что можно так ставить условие.

Это сообщение отредактировал(а) dimcat - 20.7.2008, 01:46
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Составление SQL-запросов | Следующая тема »


 




[ Время генерации скрипта: 0.2079 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.