[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Данные с двух таблиц
Okulo
всем привет.

К примеру есть таблицы – admins и mails

admins
name | mail
Admin A | admin@aa.ru
Admin B | admin@bb.ru
Admin C | admin@cc.ru

mails

id | to
1 | admin@aa.ru, admin@cc.ru
2 | admin@bb.ru, admin@aa.ru

Как сделать запрос что бы выбрать все имена из таблицы admins всех у кого мэйл указан в таблице mails. Причем в таблице mails в поле to адреса перечислены через запятую, что собственно и является для меня проблемой (

То есть под id 1 с таблицы mails должно выводиться Admin A и Admin C и т.п.




Спустя 16 часов, 57 минут, 36 секунд (24.02.2012 - 07:17) McLotos написал(а):
Не совсем понял суть задачи.
$sql=mysql_query(SELECT * FROM `mails`);
while ($res=mysql_fetch_assoc($sql))
{
$list.=$res['to'];
}

$list - список всех to полей
дальше нужно получить количество строк в результате, затем по количеству строк построить цикл foreach (отделить строки друг от друга и каждую строку разложить через explode(",",$list))
как-то так? Т.е. в результате мы получим все email'ы которые имеются в переменной $list. Или я что-то не понял. Можете более детально описать суть проблемы?

Спустя 17 минут, 41 секунда (24.02.2012 - 07:34) Okulo написал(а):
выбрал данные и разделил через
$ex = explode (",", $row['to'] );
теперь данные в массиве.

McLotos - теперь задача сопоставить выбранным мйэлам данные из другой таблицы

допустим для id 1 соответствуют Admin A и Admin С
для id 2 - Admin A и Admin B



Спустя 16 минут, 9 секунд (24.02.2012 - 07:51) sergeiss написал(а):
Цитата (Okulo @ 23.02.2012 - 15:19)
Причем в таблице mails в поле to адреса перечислены через запятую, что собственно и является для меня проблемой

Действительно, это и есть основная проблема smile.gif Тебе надо переделать эту таблицу, так, чтобы в одной строке был только один адрес и некий идентификатор, позволяющий привязать данные к другой таблице. Тогда нужные данные будут выбираться одним SQL запросом.

Почитай про нормализацию баз данных. Инфы много везде, например в Википедии: http://ru.wikipedia.org/wiki/Нормализация_баз_данных

Спустя 3 минуты, 37 секунд (24.02.2012 - 07:54) Okulo написал(а):
Цитата (sergeiss @ 24.02.2012 - 04:51)
Цитата (Okulo @ 23.02.2012 - 15:19)
Причем в таблице mails в поле to адреса перечислены через запятую, что собственно и является для меня проблемой

Действительно, это и есть основная проблема smile.gif Тебе надо переделать эту таблицу, так, чтобы в одной строке был только один адрес и некий идентификатор, позволяющий привязать данные к другой таблице. Тогда нужные данные будут выбираться одним SQL запросом.

Почитай про нормализацию баз данных. Инфы много везде, например в Википедии: http://ru.wikipedia.org/wiki/Нормализация_баз_данных

huh.gif
да уж...
теперь проблема отработки всех скриптов которые записывают в базу таким образом ..
да еще и данные как то перенести в новую таблицу...

по моему это сложнее, вам не кажется? ))

Спустя 6 минут, 56 секунд (24.02.2012 - 08:01) sergeiss написал(а):
Цитата (Okulo @ 24.02.2012 - 08:54)
по моему это сложнее, вам не кажется?

Нет smile.gif Потому что если сразу сделать правильно, то потом не надо мудрить с выборкой сложно записанных данных.

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

PS. Сделать другую таблицу и сделать скрипт для перезаписи данных в неё - это дело всего на 5-7 минут.

Спустя 38 минут, 23 секунды (24.02.2012 - 08:40) McLotos написал(а):
Сохраняете нужный email в переменную mail через цикл, дальше передаёте в запрос, и обрабатываете.
$sql=mysql_query("SELECT Name FROM admin WHERE `mail`='$mail'");

Спустя 1 час, 5 минут, 13 секунд (24.02.2012 - 09:45) Undertaker написал(а):
Хрена сколько головняка, надо было сразу вносить не mail a id и тогда посредством JOIN ну или хотя бы маилы были в разных колонках тогда через where. Попробуй так SELECT *
FROM admins
INNER JOIN mail ON admins.mail = mails.to возможно где то надо добавить % % (приблизительный поиск)

Спустя 6 минут, 40 секунд (24.02.2012 - 09:51) Okulo написал(а):
Цитата (McLotos @ 24.02.2012 - 05:40)
Сохраняете нужный email в переменную mail через цикл, дальше передаёте в запрос, и обрабатываете.
$sql=mysql_query("SELECT Name FROM admin WHERE `mail`='$mail'");

делал подобным образом
получалось так: при выборе ("SELECT Name FROM admin WHERE `mail`='$mail'"); получается что в принципе в массиве несколько имэйлов и поэтому один из них будет в $mail. соответственно выводятся куча записей где есть один из имэйлов переменной $mail

блин, сам запутался smile.gif

Спустя 8 минут, 34 секунды (24.02.2012 - 10:00) Okulo написал(а):
Цитата (sergeiss @ 24.02.2012 - 05:01)
Цитата (Okulo @ 24.02.2012 - 08:54)
по моему это сложнее, вам не кажется?

Нет smile.gif Потому что если сразу сделать правильно, то потом не надо мудрить с выборкой сложно записанных данных.

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

PS. Сделать другую таблицу и сделать скрипт для перезаписи данных в неё - это дело всего на 5-7 минут.

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

отправляются данные в БД в таблицу user - unik, name, lastname
и хочу записать в таблицу mails - unik , email

что соответствовать должно такому :
несколько юзеров и у каждого свой unik id, к ID привязано несколько адресов.

так вот, как одновременно с формы записать в эти две таблицы такие данные?

з.ы. сори за отступление от главной темы, но так я думаю смогу разделить адреса и выводить уж по отдельности. или я не туда мыслю? )

Спустя 7 минут, 5 секунд (24.02.2012 - 10:07) sergeiss написал(а):
Цитата (Okulo @ 24.02.2012 - 11:00)
сори за отступление от главной темы, но так я думаю смогу разделить адреса и выводить уж по отдельности. или я не туда мыслю? )

Где ж тут отступление от темы? Это просто поворот темы в более правильную сторону smile.gif

Цитата (Okulo @ 24.02.2012 - 11:00)
так вот, как одновременно с формы записать в эти две таблицы такие данные?

А в чем именно проблема? Данные у тебя есть. Создаёшь нужные запросы и пишешь в БД. Единственное примечание - уникальный ID надо "дать на откуп" таблице. Пусть она создает. Т.е. ты пишешь данные юзера в таблицу, получаешь ID записи и используешь этот ID для вставки данных с почтой. А также могут быть еще таблицы с телефонами, адресами и другими типами данных - организовать можно по такому же принципу, как только что обговорили.

Спустя 3 минуты, 50 секунд (24.02.2012 - 10:11) McLotos написал(а):
explode+цикл в помощь. Я показал направление, думайте
А вообще тяжеловато работать с абстрактными данными. Вы бы код показали или хотябы дамп таблиц

Спустя 18 минут, 30 секунд (24.02.2012 - 10:29) Okulo написал(а):
Цитата (sergeiss @ 24.02.2012 - 07:07)

А в чем именно проблема? Данные у тебя есть. Создаёшь нужные запросы и пишешь в БД. Единственное примечание - уникальный ID надо "дать на откуп" таблице. Пусть она создает. Т.е. ты пишешь данные юзера в таблицу, получаешь ID записи и используешь этот ID для вставки данных с почтой. А также могут быть еще таблицы с телефонами, адресами и другими типами данных - организовать можно по такому же принципу, как только что обговорили.

в том и проблема что я не совсем понимаю как это сделать
<?
$result = mysql_query("INSERT INTO `unik` ( `name`,`lastname`) VALUES ( '$name','$lastname')",$db);

$zp = mysql_query("select * from unik",$db2); // не пойму что выбрать :(

$result2 = mysql_query("INSERT INTO `mails` "); // тут я вообще не знаю что записывать :((
?>


если не трудно, приведете примерчик плиз

Спустя 3 дня, 9 минут, 16 секунд (27.02.2012 - 10:39) Okulo написал(а):
как записать данные в две таблицы?

Спустя 1 час, 19 минут, 41 секунда (27.02.2012 - 11:58) sergeiss написал(а):
Okulo - почитай в хэлпе про автоинкрементные поля и функцию из MySQL с именем LAST_INSERT_ID(). Ты можешь задать в таблице unik автоинкрементное поле. Затем, сразу же после вставки данных, считываешь его значение, которое используешь для вставки данных во вторую таблицу.

А еще лучше smile.gif используй, при возможности, PostgreSQL. Там это решается намного проще надежнее, чем в Мускуле.

Спустя 1 день, 2 часа, 40 минут, 53 секунды (28.02.2012 - 14:39) Okulo написал(а):
поле айди с автоинкрементом я сделал ...

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

примерчик может есть хоть какой нибудь? smile.gif

Спустя 5 минут, 2 секунды (28.02.2012 - 14:44) twin написал(а):
mysql_insert_id()

Спустя 3 минуты, 6 секунд (28.02.2012 - 14:47) Visman написал(а):
mysql_query('INSERT ...', link);
$new_id = mysql_insert_id(link);

Спустя 17 часов, 1 минута, 37 секунд (29.02.2012 - 07:49) Okulo написал(а):
со вставкой все понял.

теперь вся суть - есть две таблицы

admins имеет поля id|name
и
mails имеет поля name_id | email

далее есть форма, которая отправляет имя и несколько выбранных (чек-боксом) адресов.
получаем выбранные данные: имя и адрес1, адрес2 например. причем адреса приходят массивом.

делаю запрос

 $resultat = mysql_query("INSERT INTO `admins` (`name`) VALUES ( '$name')",$db);

$last_id = mysql_insert_id();

mysql_query("INSERT INTO `mails` ( `name_id`, `email`) VALUES ( '$last_id', '$emai')", $db);



понятно, что таким образом я запишу только Array в поле email, или данные если был выбран тока один адрес.
вопрос: как правильно записать во вторую таблицу строки с массива?


Спустя 1 день, 6 часов, 8 минут, 22 секунды (1.03.2012 - 13:57) Okulo написал(а):
подскажите товарищи ))

Спустя 6 минут, 8 секунд (1.03.2012 - 14:03) Visman написал(а):
Okulo, если нужно записать массив в одно текстовое поле таблицы сериализуй его ф-ей serialize()

Спустя 2 минуты, 50 секунд (1.03.2012 - 14:06) Okulo написал(а):
Visman как раз таки надо записать данные в разные строки

Спустя 15 минут, 46 секунд (1.03.2012 - 14:22) Visman написал(а):
Именно в разные строки, а не поля?

Спустя 7 минут, 30 секунд (1.03.2012 - 14:30) Okulo написал(а):
Visman - именно в разные строки.
есть несколько адресов для одного айди в массиве (выше кстати описал)
и надо их вписать в разные строки полей id и mail

Спустя 5 минут, 22 секунды (1.03.2012 - 14:35) Visman написал(а):
Если нужно пары из массива вписать, то размещай блок
 $resultat = mysql_query("INSERT INTO `admins` (`name`) VALUES ( '$name')",$db);

$last_id = mysql_insert_id();

mysql_query("INSERT INTO `mails` ( `name_id`, `email`) VALUES ( '$last_id', '$emai')", $db);

в цикл и в этом же цикле (перед блоком) бери $name и $emai из массива.
Если надо для одного $name вписать несколько $emai, то это
 $resultat = mysql_query("INSERT INTO `admins` (`name`) VALUES ( '$name')",$db);

$last_id = mysql_insert_id();

размещай перед циклом, а в цикле только второй запрос.

Спустя 7 минут, 9 секунд (1.03.2012 - 14:42) Okulo написал(а):
а нет примера какого нибудь хотя бы?

Спустя 4 дня, 17 часов, 3 минуты, 49 секунд (6.03.2012 - 07:46) Okulo написал(а):
размещай перед циклом, а в цикле только второй запрос -
вернулся к данному вопросу, если честно я новичок в этом деле, поэтому не понимаю - перед каким циклом то? ((
можете набросать пример: как циклом записать данные в строки?

Спустя 4 часа, 37 минут, 15 секунд (6.03.2012 - 12:23) Visman написал(а):
Что-то я нить обсуждения потерял.
Еще раз в одном сообщении напиши в чем вопрос? Что из чего требуется получить?

Спустя 55 минут, 9 секунд (6.03.2012 - 13:18) Okulo написал(а):
Цитата (Okulo @ 29.02.2012 - 04:49)
теперь вся суть - есть две таблицы

admins имеет поля id|name
и
mails имеет поля name_id | email

далее есть форма, которая отправляет имя и несколько выбранных (чек-боксом) адресов.
получаем выбранные данные: имя и адрес1, адрес2 например. причем адреса приходят массивом.

делаю запрос

 $resultat = mysql_query("INSERT INTO `admins` (`name`) VALUES ( '$name')",$db);

$last_id = mysql_insert_id();

mysql_query("INSERT INTO `mails` ( `name_id`, `email`) VALUES ( '$last_id', '$emai')", $db);



понятно, что таким образом я запишу только Array в поле email, или данные если был выбран тока один адрес.
вопрос: как правильно записать во вторую таблицу строки с массива?

тут я полностью описал задачу. - взять данные с одной таблицы и записать несколько строк с полученным айди во вторую таблицу (вкраце)

Спустя 7 минут, 16 секунд (6.03.2012 - 13:26) Visman написал(а):
Примерно так
$resultat = mysql_query("INSERT INTO `admins` (`name`) VALUES ('$name')",$db);

$last_id = mysql_insert_id($db);

foreach ($emails as $email) {
mysql_query("INSERT INTO `mails` (`name_id`, `email`) VALUES ($last_id, '$email')", $db);
}


Где $emails это массив вставляемых адресов.

Спустя 21 минута, 2 секунды (6.03.2012 - 13:47) Okulo написал(а):
Visman - спасибо большое! получилось.

+ вам в карму wink.gif

Спустя 2 минуты, 3 секунды (6.03.2012 - 13:49) Visman написал(а):
А надо было в одну строку таблицы все адреса, чтоли?
Тогда один запрос
mysql_query("INSERT INTO `mails` (`name_id`, `email`) VALUES ($last_id, '".implode(',', $emails)."')", $db);

без всяких циклов.

Спустя 6 минут, 5 секунд (6.03.2012 - 13:55) Okulo написал(а):
нет. как раз таки нужно было в несколько. потому как не удобно потом обрабатывать полученные данные. хоты пробовал вначале разбивать их explode на выходе )

кстати, а может подскажите почему я сразу делаю к примеру отправку письма на адрес из БД:

$adm= mysql_query("SELECT * FROM nails WHERE `id`='".$_GET['s_id']."'",$db2);
$row= mysql_fetch_array($adm);
$to = $row['email'];

//тут тело и все такое
mail($to, $subject, $message, $headers);


то письмо не уходит.

а если так например :

$to ='admin@test.ru';

то уходит

Спустя 19 часов, 39 минут, 30 секунд (7.03.2012 - 09:34) Okulo написал(а):
не хотелось создавать отдельную тему, может тут кто подскажет -
как отправить письмо на несколько адресов из БД?

(это обратное тому что в теме ))

Спустя 16 минут, 44 секунды (7.03.2012 - 09:51) Visman написал(а):
Цитата (Okulo @ 6.03.2012 - 18:55)
то письмо не уходит.

Выведи переменную на печать, чтобы увидеть куда ты пытаешься письмо отправить.

Цитата (Okulo @ 7.03.2012 - 14:34)
как отправить письмо на несколько адресов из БД?

В обратном порядке и действуй.
Делай запрос SELECT с нужным условием.
Потом обрабатывай ответ в цикле http://www.php.su/functions/?mysql-fetch-assoc

Спустя 9 минут, 9 секунд (7.03.2012 - 10:00) Okulo написал(а):
я просто не совсем понимаю -
$to  ='admin@test.ru';
$subject = 'Тема письма';
$message = 'Текст письма';
$headers = 'MIME-Version: 1.0' . "\r\n";
$headers .= 'Content-type: text/html; charset=windows-1251' . "\r\n";
$headers .= 'To: user <user@example.com>' . "\r\n";
$headers .= 'From: server <server@example.com>' . "\r\n";

mail($to, $subject, $message, $headers)

в такой конструкции можно ли перечислять адреса через запятую тут ? -
$to  ='admin@test.ru, admin2@test.ru';


или лучше делать в bcc ?

Спустя 4 минуты, 54 секунды (7.03.2012 - 10:05) Visman написал(а):
В цикле с использованием команды mysql_fetch_assoc на которую я дал ссылку где есть пример.
Можешь перевести результат из таблицы в строку вида 'admin@test.ru, admin2@test.ru'
Можешь каждый раз новое письмо в цикле на единичный адрес отправлять.

Спустя 1 час, 44 минуты, 10 секунд (7.03.2012 - 11:49) Okulo написал(а):
спасибо, понял.
решил каждый раз на новый адрес отправлять в цикле - так легче biggrin.gif
Быстрый ответ:

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