Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.05.2015, 11:37   #1
s88s
Форумчанин
 
Регистрация: 02.01.2014
Сообщений: 369
По умолчанию цикл в цикле for и объединение массива

Доброго времени суток !

помогите решить задачу не как не получается (((

есть две таблицы в базе данных

в первой таблице три столбца id, title, text ну и предположим три строчки

1 название_1 текст_1
2 название_2 текст_2
3 название_3 текст_3

и во второй таблице тоже три столбца id, title, user и так же три записи

1 название_1 Иванов
2 название_2 Петров
3 название_3 Иванов

и как мне с помощью цикла for вывести все тексты которые относятся к Иванову и текст в который относится к Петрову

задача такая надо что бы выводилось так :

Иванов
название_1 текст_1
название_3 текст_3

Петров
название_2 текст_2

я так понимаю что надо все это вывести цикл в цикле только как это правильно вывести что бы получить желаемый результат
"Я не волшебник, я только учусь"
s88s вне форума Ответить с цитированием
Старый 18.05.2015, 11:52   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Ну для начала нужен JOIN в SQL запросе.

А чего БД не нормализованная совсем что ли? Вместо "Иванов" обычно ID из таблицы User пишут, и про название во второй таблице аналогично. (а зачем вообще отдельная таблица для этого? разве что если у одного текста может быть более 1 автора)
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 18.05.2015 в 12:12.
Alex11223 вне форума Ответить с цитированием
Старый 18.05.2015, 12:19   #3
s88s
Форумчанин
 
Регистрация: 02.01.2014
Сообщений: 369
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Ну для начала нужен JOIN в SQL запросе.

А чего БД не нормализованная совсем что ли? Вместо "Иванов" обычно ID из таблицы User пишут.
вывод из БД это без проблем все в цикле перебирается нормально причем что из одной и из другой ... я просто не понимаю как сделать вывод как выше написал я .

Мне разницы нет как вывод этот будет сделан но id или же по названию .... я просто не понимаю как .
"Я не волшебник, я только учусь"

Последний раз редактировалось s88s; 18.05.2015 в 12:22.
s88s вне форума Ответить с цитированием
Старый 18.05.2015, 12:27   #4
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

https://www.google.com/search?q=sql+join
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 18.05.2015, 13:20   #5
s88s
Форумчанин
 
Регистрация: 02.01.2014
Сообщений: 369
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Спасибо большое за ссылку нашел видео урок где все это объясняют ... буду пробовать
"Я не волшебник, я только учусь"
s88s вне форума Ответить с цитированием
Старый 19.05.2015, 11:18   #6
s88s
Форумчанин
 
Регистрация: 02.01.2014
Сообщений: 369
По умолчанию

Хоть убейте не понимаю =(

про sql join почитал попробовал

Код:
SELECT * FROM TableA
INNER JOIN TableB
ON TableA.name = TableB.name
При совпадении строк происходит вывод .... вот только не как не могу понять как мне реализовать свою задумку

попробую еще раз объяснить что хочу сделать ( в момент написания я понял что не правильно поставил себе задачу и внес небольшую корректировку в бд )

есть две таблицы

в первой таблице три столбца id, Имя
во второй таблице тоже три поля id, id_юзера, название, текст

надо мне вывести всех юзеров и что бы под каждым юзером из второй таблицы появлялось то что он написал

вывод из базы я могу сделать ... а вот распределить вывод под каждого юзера не понимаю как даже с join
"Я не волшебник, я только учусь"
s88s вне форума Ответить с цитированием
Старый 19.05.2015, 12:10   #7
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Можно после этого запроса пройтись в цикле по полученным строкам создавая массив, в котором ключ — ид пользователя (ну или имя, приджоененное из таблицы пользователей), а значение — массив с именами статей.
Ну то есть просто на каждой итерации цикла что-то типа
Код:
arr[user_id].добавить(название)
А зачем тут 2 таблицы? Если у 1 статьи не более 1 автора, то можно это в 1 таблицу.

Ну а если уж так, то и название статьи не надо дублировать во 2 таблице (вдруг изменить его надо будет?), должно быть так в общем:
Код:
SELECT articles.title, articles.text, users.name FROM articles
JOIN articles_users ON articles_users.articleId = articles.id
JOIN users ON users.id = articles_users.userId
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 19.05.2015, 12:19   #8
s88s
Форумчанин
 
Регистрация: 02.01.2014
Сообщений: 369
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Можно после этого запроса пройтись в цикле по полученным строкам создавая массив, в котором ключ — ид пользователя (ну или имя, приджоененное из таблицы пользователей), а значение — массив с именами статей.
Ну то есть просто на каждой итерации цикла что-то типа
Код:
arr[user_id].добавить(название)
А зачем тут 2 таблицы? Если у 1 статьи не более 1 автора, то можно это в 1 таблицу.

Ну а если уж так, то и название статьи не надо дублировать во 2 таблице (вдруг изменить его надо будет?), должно быть так в общем:
Код:
SELECT articles.title, articles.text, users.name FROM articles
JOIN articles_users ON articles_users.articleId = articles.id
JOIN users ON users.id = articles_users.userId
да с дублированием названия я уже понял что не надо дублировать ... и в последнем топике изменил таблицы.

по примерам попробую сделать по результату отпишусь )
"Я не волшебник, я только учусь"
s88s вне форума Ответить с цитированием
Старый 19.05.2015, 12:44   #9
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

Можно примерно так реализовать:
Таблицы `users` и `users_texts`:
PHP код:
mysqlselect from `users`;
+----+--------+
id name   |
+----+--------+
|  
User 1 |
|  
User 2 |
|  
User 3 |
+----+--------+
3 rows in set (0.00 sec)

mysqlselect from `users_texts`;
+----+---------+---------+--------+
id user_id title   text   |
+----+---------+---------+--------+
|  
|       Title 1 Text 1 |
|  
|       Title 2 Text 2 |
|  
|       Title 3 Text 3 |
|  
|       Title 4 Text 4 |
|  
|       Title 5 Text 5 |
|  
|       Title 6 Text 6 |
|  
|       Title 7 Text 7 |
+----+---------+---------+--------+
7 rows in set (0.00 sec
Код:
PHP код:
try {
    
$pdo = new PDO("mysql:host=127.0.0.1;dbname=test"'test''test');

    
$sql "SELECT `ut`.`user_id`, `u`.`name`, `ut`.`title`, `ut`.`text` 
            FROM `users_texts` `ut`
            JOIN `users` `u` ON `u`.`id` = `ut`.`user_id`
            ORDER BY `ut`.`user_id` ASC"
;

    
$stmt $pdo->query($sql);
    
$results $stmt->FetchAll(PDO::FETCH_ASSOC); // результаты запроса в ассоциативном массиве
    
    
if(!empty($results)){
        
$current_user_id 0// ID текущего пользователя
        
foreach ($results as $row) {
            
// новый пользователь?
            
if($current_user_id != $row['user_id']){
                if(!empty(
$current_user_id)){
                    echo 
'</ul>'// закрываем список текстов предыдущего пользователя (если он вообще был)
                
}
                
$current_user_id $row['user_id']; // меняем ID текущего пользователя
                
echo '<b>' $row['name'] . '</b><br/><ul>'// выводим имя пользователя + открываем список его текстов
            
}
            
// очередной текст текущего пользователя
            
echo '<li>' $row['title'] . ' : ' $row['text'] . '</li>'
        }
        echo 
'</ul>'// закрываем список текстов
    
}
    else{
        echo 
'Not found!(('// пустой результат запроса
    
}

} catch(
PDOException $e) {
    echo 
"Error: ".$e->getMessage()."<br/>";
    echo 
"On line: ".$e->getLine();

Результат:

Последний раз редактировалось Andkorol; 19.05.2015 в 14:00.
Andkorol вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Цикл в цикле cashmail Общие вопросы Delphi 4 11.08.2013 20:57
Цикл в цикле EkleP PHP 1 12.02.2012 01:29
Цикл в цикле Зод Помощь студентам 1 19.11.2011 04:40
Цикл в цикле... Davlet M Помощь студентам 6 25.01.2010 01:42