Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: Выборка полей из двух таблиц при условии
Покинул форум
Сообщений всего: 111
Дата рег-ции: Окт. 2009 Откуда: Казахстан, Алматы
Помог: 0 раз(а)
Привет!
Столкнулся с проблемой, когда пришлось разбить огромную таблицу на 2: в одной находится основная информация о еде, во второй таблице - дополнительная информация.
Например, тип вкуса (кислый, сладкий и т.д.), но это очень редкая информация, т.е. на 100 пунктов еды может быть только 2-5 пунктов вкусов.
Теперь не могу никак связать 2 этих таблицы, читал про IS NOT NULL, но это, как я понял, не то. Может, кто вкурсе, если какие-нибудь варианты, как можно выбрать селектом вторую таблицу, если, например, поле в первой равно "1" или, например, не равно NULL, либо что-то в этом роде?
Пробовал джоинтами соединить, но выбираются только те строки, которые есть в обоих таблицах, селектами через запятую тоже не выходит - либо ничего, либо сразу всё выбирается при совпадении строк в обоих таблицах.
3d_killer
Отправлено: 29 Марта, 2014 - 07:23:28
Участник
Покинул форум
Сообщений всего: 1916
Дата рег-ции: Апр. 2011 Откуда: Ростов-на-Дону
Покинул форум
Сообщений всего: 111
Дата рег-ции: Окт. 2009 Откуда: Казахстан, Алматы
Помог: 0 раз(а)
3d_killer, спасибо за ответ. Именно так и делал - получал одну строку из сотни, если по иду сравнение не делать - получаю все блюда с одинаковым вкусом. Нашел также [url = http://opennet.ru/docs/RUS/psql_tutor733/tutorial-join.html]статью[/url] в сети, где говорится, что при LEFT JOINT должны прибавляться пустые строки, но они у меня почему-то не прибавляются, на выходе - только одна строка с совпавшими идами. Эх, ёлки, куда копать... ???
Покинул форум
Сообщений всего: 90
Дата рег-ции: Янв. 2014
Помог: 7 раз(а)
Чтобы выводились ВСЕ записи из первой таблице при джоине используйте
LEFT OUTER JOIN
Если совпадений из 2-й таблицы не будет, значения заполнятся null'ами
isle
Отправлено: 29 Марта, 2014 - 15:34:45
Гость
Покинул форум
Сообщений всего: 111
Дата рег-ции: Окт. 2009 Откуда: Казахстан, Алматы
Помог: 0 раз(а)
peters пишет:
Чтобы выводились ВСЕ записи из первой таблице при джоине используйте
LEFT OUTER JOIN
В справках пишут, что LEFT OUTER JOIN и LEFT JOIN - одно и тоже, но на всякий случай я попробовал оба варианта. Не помогло.
peters пишет:
Если совпадений из 2-й таблицы не будет, значения заполнятся null'ами
Да, верно, в хелпах так и написано, выше привел ссылку на один из таких хелпов, но в моём случае оно так не работает почему-то.
Мне бы очень не хотелось делать одну огромную таблицу, которая почти всегда будет пустой, чтобы выйти из ситуации. Может, кто-нибудь сможет решить эту проблему за небольшую денюжку непосредственно на моём сервере (предоставлю доступ)?
Ещё раз уточню проблему.
1. Есть 2 таблицы: 1 - товар; 2 - доп. инфо. Первая таблица может иметь 100 строк, вторая - 0...10. Нужно вторую таблицу припаять к первой, можно путём джоинтов заполнить поля пустотой, можно путём различных проверок, типа IF(), IS NOT NULL и др. добавить поля 2-й таблицы к первой.
2. Если я ставлю какие-то условия, например, по совпадению идов, то получаю столько строк, сколько есть совпадений в первой и второй таблице, а должен получить все строки (из первой таблицы) с пустыми полями (второй таблицы), либо добавленными к первой таблице, если метка поля первой таблицы не равна 0 (NULL).
LIME
Отправлено: 29 Марта, 2014 - 16:32:42
Активный участник
Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010
Помог: 322 раз(а)
$query ?
isle
Отправлено: 29 Марта, 2014 - 16:41:27
Гость
Покинул форум
Сообщений всего: 111
Дата рег-ции: Окт. 2009 Откуда: Казахстан, Алматы
Помог: 0 раз(а)
LIME пишет:
$query ?
Не понял, о чём речь
Пока выход для себя вижу только один - сначала выбрать все блюда и их иды, вторым запросом получить уже вкусы по этим идам.
Табличек планируется много, поэтому было бы здорово всё брать одним запросом в один массив, а не двумя и потом эти массивы в циклах крутить...
Если кто знает решение в 1 запрос (если оно, конечно, есть) - пишите кошелёк wm, угощу пивком, а то удваивать кол-во всех запросов или заполнять огромные таблицы нулами мне кажется очень неинженерным подходом.
LIME
Отправлено: 29 Марта, 2014 - 17:30:07
Активный участник
Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010
Помог: 322 раз(а)
запрос свой покажи
isle
Отправлено: 29 Марта, 2014 - 17:48:15
Гость
Покинул форум
Сообщений всего: 111
Дата рег-ции: Окт. 2009 Откуда: Казахстан, Алматы
Возможно, что-то не так в табличках??? - здесь опыта тоже не очень много, но, вроде, сделал их правильно. Вариаций везде перепробовал очень много - в самих табличках (полях и ключах) и в запросах.
AND t3.code_lang ='".$mycurrent["language"]["code"]."'
AND t5.mid = t1.meal_id
LIMIT100
isle
Отправлено: 29 Марта, 2014 - 18:23:14
Гость
Покинул форум
Сообщений всего: 111
Дата рег-ции: Окт. 2009 Откуда: Казахстан, Алматы
Помог: 0 раз(а)
Опять перепробовал кучу вариантов только что по условию ON - не хочет работать и всё тут... Эх. Если прописать любую ерунду, типа:
ON t4.mid != 0
то работает, но так по логике неверно, выдаёт, естественно чушь, все остальные варианты - пустой массив, включая написанный выше. Селект в селекте тоже пробовал (IF EXISTS) - не получилось.
Пока сделаю как умею (с двумя запросами), если у кого будет желание ради спортивного интереса поковырять у себя или у меня на сервере, черкните. За решение - угощу пивком.
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.