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 :: Выборка полей из двух таблиц при условии

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: Выбор полей из второй таблицы, если поле в первой не пусто
isle
Отправлено: 29 Марта, 2014 - 05:10:21
Post Id



Гость


Покинул форум
Сообщений всего: 111
Дата рег-ции: Окт. 2009  
Откуда: Казахстан, Алматы


Помог: 0 раз(а)




Привет!

Столкнулся с проблемой, когда пришлось разбить огромную таблицу на 2: в одной находится основная информация о еде, во второй таблице - дополнительная информация.

Например, тип вкуса (кислый, сладкий и т.д.), но это очень редкая информация, т.е. на 100 пунктов еды может быть только 2-5 пунктов вкусов.

Теперь не могу никак связать 2 этих таблицы, читал про IS NOT NULL, но это, как я понял, не то. Может, кто вкурсе, если какие-нибудь варианты, как можно выбрать селектом вторую таблицу, если, например, поле в первой равно "1" или, например, не равно NULL, либо что-то в этом роде?

Пробовал джоинтами соединить, но выбираются только те строки, которые есть в обоих таблицах, селектами через запятую тоже не выходит - либо ничего, либо сразу всё выбирается при совпадении строк в обоих таблицах.
 
 Top
3d_killer
Отправлено: 29 Марта, 2014 - 07:23:28
Post Id



Участник


Покинул форум
Сообщений всего: 1916
Дата рег-ции: Апр. 2011  
Откуда: Ростов-на-Дону


Помог: 21 раз(а)




CODE (SQL):
скопировать код в буфер обмена
  1. SELECT table_a.*, table_b.* FROM
  2. table_a
  3. LEFT JOIN table_b ON
  4. table_b.table_a_id =table_a.id
  5. WHERE table_a.id=$id

(Отредактировано автором: 29 Марта, 2014 - 07:23:45)

 
My status
 Top
isle
Отправлено: 29 Марта, 2014 - 10:04:39
Post Id



Гость


Покинул форум
Сообщений всего: 111
Дата рег-ции: Окт. 2009  
Откуда: Казахстан, Алматы


Помог: 0 раз(а)




3d_killer, спасибо за ответ. Именно так и делал - получал одну строку из сотни, если по иду сравнение не делать - получаю все блюда с одинаковым вкусом. Нашел также [url = http://opennet.ru/docs/RUS/psql_tutor733/tutorial-join.html]статью[/url] в сети, где говорится, что при LEFT JOINT должны прибавляться пустые строки, но они у меня почему-то не прибавляются, на выходе - только одна строка с совпавшими идами. Эх, ёлки, куда копать... ???

Функция вывода запроса такая:

PHP:
скопировать код в буфер обмена
  1. function dbQuery($query) {
  2. $db = open_connection();
  3. $result = array();
  4. $sql = $db->prepare($query);
  5. $sql->execute();
  6. while($r = $sql->fetch(PDO::FETCH_ASSOC)) {array_push($result,$r);}
  7. return $result;
  8. }


Видимо, что-то в строке изменить?

CODE (htmlphp):
скопировать код в буфер обмена
  1. while($r = $sql->fetch(PDO::FETCH_ASSOC)) {array_push($result,$r);}


Я здесь не очень силён, можете подсказать?
 
 Top
peters
Отправлено: 29 Марта, 2014 - 12:46:14
Post Id


Гость


Покинул форум
Сообщений всего: 90
Дата рег-ции: Янв. 2014  


Помог: 7 раз(а)




Чтобы выводились ВСЕ записи из первой таблице при джоине используйте
LEFT OUTER JOIN

Если совпадений из 2-й таблицы не будет, значения заполнятся null'ами
 
 Top
isle
Отправлено: 29 Марта, 2014 - 15:34:45
Post Id



Гость


Покинул форум
Сообщений всего: 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).
 
 Top
LIME
Отправлено: 29 Марта, 2014 - 16:32:42
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




$query ?
 
 Top
isle
Отправлено: 29 Марта, 2014 - 16:41:27
Post Id



Гость


Покинул форум
Сообщений всего: 111
Дата рег-ции: Окт. 2009  
Откуда: Казахстан, Алматы


Помог: 0 раз(а)




LIME пишет:
$query ?

Не понял, о чём речь Улыбка

Пока выход для себя вижу только один - сначала выбрать все блюда и их иды, вторым запросом получить уже вкусы по этим идам.

Табличек планируется много, поэтому было бы здорово всё брать одним запросом в один массив, а не двумя и потом эти массивы в циклах крутить...

Если кто знает решение в 1 запрос (если оно, конечно, есть) - пишите кошелёк wm, угощу пивком, а то удваивать кол-во всех запросов или заполнять огромные таблицы нулами мне кажется очень неинженерным подходом.
 
 Top
LIME
Отправлено: 29 Марта, 2014 - 17:30:07
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




запрос свой покажи
 
 Top
isle
Отправлено: 29 Марта, 2014 - 17:48:15
Post Id



Гость


Покинул форум
Сообщений всего: 111
Дата рег-ции: Окт. 2009  
Откуда: Казахстан, Алматы


Помог: 0 раз(а)




А, ёлки, вот.
Сейчас так:
Спойлер (Отобразить)

А пробовал так:
Спойлер (Отобразить)

и так:
Спойлер (Отобразить)

Что с джоинтами, что без - одинаково работает: либо все строки (блюда) берет с одинаковым вкусом, либо только те, что совпадают в обеих таблицах.

Уже несколько дней читаю хелпы - не могу понять почему так, думаю, это может быть связано с классом PDO, я с ним впервые столкнулся.

Таблицы:
Спойлер (Отобразить)


Спойлер (Отобразить)


Возможно, что-то не так в табличках??? - здесь опыта тоже не очень много, но, вроде, сделал их правильно. Вариаций везде перепробовал очень много - в самих табличках (полях и ключах) и в запросах.

(Отредактировано автором: 29 Марта, 2014 - 17:54:12)

 
 Top
LIME
Отправлено: 29 Марта, 2014 - 17:57:47
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




CODE (SQL):
скопировать код в буфер обмена
  1. SELECT
  2.                 t1.meal_id,
  3.                 t1.meal_category_id,
  4.                 t2.photo,
  5.                 t2.meta,
  6.                 t2.cost,
  7.                 t3.name,
  8.                 t3.info,
  9.                 taste,
  10.                                 t4.meal_id AS mid,
  11.                                 t4.taste AS taste,
  12.                                 t4.taste_type AS taste_type,
  13.                                 t4.size AS size,
  14.                                 t4.paste AS paste,
  15.                                 t4.new_cost AS new_cost
  16.         FROM
  17.                 #__catering_meal AS t1,
  18.                 #__meal AS t2,
  19.                 #__meal_lang AS t3
  20.         LEFT JOIN #__meal_meta AS t4 ON t4.mid = t1.meal_id
  21.         WHERE
  22.                 t1.catering_id = " . $data["CARD"]["id"] . "
  23.                 AND t2.meal_id = t1.meal_id
  24.                 AND t3.meal_id = t1.meal_id
  25.                 AND t3.code_lang = '".$mycurrent["language"]["code"]."'
  26.                 AND t5.mid = t1.meal_id
  27.         LIMIT 100
 
 Top
isle
Отправлено: 29 Марта, 2014 - 18:23:14
Post Id



Гость


Покинул форум
Сообщений всего: 111
Дата рег-ции: Окт. 2009  
Откуда: Казахстан, Алматы


Помог: 0 раз(а)




Опять перепробовал кучу вариантов только что по условию ON - не хочет работать и всё тут... Эх. Если прописать любую ерунду, типа:

ON t4.mid != 0

то работает, но так по логике неверно, выдаёт, естественно чушь, все остальные варианты - пустой массив, включая написанный выше. Селект в селекте тоже пробовал (IF EXISTS) - не получилось.

Пока сделаю как умею (с двумя запросами), если у кого будет желание ради спортивного интереса поковырять у себя или у меня на сервере, черкните. За решение - угощу пивком.

Спасибо за внимание откликнувшимся.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB