|
|
|
| есть две таблицы. как сделать код, чтобы он переносил данные из одной таблицы в другую по условию если в первой таблице будет более 2 записей.помогите пожалуйста. я сам пробовал но фигня получилась. заранее спасибо всем ответившим и до конца прочитавшим | |
|
|
|
|
|
|
|
для: winflip
(02.08.2007 в 14:38)
| |
<?php
$sql = mysql_query("SELECT COUNT(*) FROM `tbl_1`;");
$result = mysql_result($sql, 0);
if($result > 2)
{
mysql_unbuffered_query("INSERT INTO `tbl_2` (SELECT * FROM `tbl_1`);");
mysql_unbuffered_query("DELETE FROM `tbl_1`;");
}
?>
|
P.S. При условии, что структуры одинаковые, конечно. | |
|
|
|
|
|
|
|
для: Unkind
(02.08.2007 в 14:50)
| | да спасибо. а вы не могли бы пояснить функцию mysql_unbuffered_query? | |
|
|
|
|
|
|
|
для: winflip
(02.08.2007 в 14:55)
| | Лучше набрать в адресной строке http://php.net/name_of_unknown_function:
http://php.net/mysql_unbuffered_query
Есть шанс, что она потребит меньше оперативной памяти. | |
|
|
|
|
|
|
|
для: Unkind
(02.08.2007 в 14:58)
| | спасибо | |
|
|
|
|
|
|
|
для: winflip
(02.08.2007 в 14:38)
| | Если вы имеете ввиду таблицы MySQL, то схема (самая простая, но не оптимизированная) действий следующая:
1. Скрипт определяет, сколько записей в таблице №1.
2. Делаете запрос к таблице №1и выбираете из нее все записи.
3. В том же цикле, где определяется содержимое ячеек таблицы (см. выше) после выборки одной строки вставляем данные в другую таблицу, соблюдая необходимую структуру.
Целиком это выглядит так:
<?
//Названия таблиц
$table_1="table1_name";
$table_2="table2_name";
//Выборка данных
$select_sql=mysql_query("SELECT * FROM `".$table_1."`");
while ($row=mysql_fetch_array($sql) {
$field_1=$row['field_1'];
$field_2=$row['field_2'];
...
$field_n=$row['field_n'];
INSERT INTO `".$table_2."` VALUES('".$field_1."', '".$field_n."');
}
?>
|
Код запросов к БД можно и нужно оптимизировать, позже если время будет - напишу. | |
|
|
|
|
|
|
|
для: aexb
(02.08.2007 в 15:06)
| | спасибо | |
|
|
|
|
|
|
|
для: aexb
(02.08.2007 в 15:06)
| | эта операция выпполняется простейшим запросом
INSERT INTO $table_2 SELECT * FROM $table_1 | |
|
|
|
|
|
|
|
для: Trianon
(02.08.2007 в 15:21)
| | в смысле как написал анкинд? | |
|
|
|
|
|
|
|
для: winflip
(02.08.2007 в 15:27)
| | в смысле - как написал я.
Одним SQL-запросом. | |
|
|
|
|
|
|
|
для: Trianon
(02.08.2007 в 15:29)
| | спасибо | |
|
|
|
|
|
|
|
для: winflip
(02.08.2007 в 15:27)
| | в смысле как написал анкинд?
Мой ник читается "анкайнд".
Trianon, у меня-то вроде тоже самое.
P.S. Ух ты. Обычный шрифт - "д", курсив - "д" | |
|
|
|
|
|
|
|
для: Unkind
(02.08.2007 в 15:31)
| | извини я не знал | |
|
|
|
|
|
|
|
для: Unkind
(02.08.2007 в 15:31)
| | извини я не знал. а с трианоном вы правы | |
|
|
|
|
|
|
|
для: winflip
(02.08.2007 в 15:51)
| | а как сделать чтобы он последние 2 записи оставлял в первой таблице | |
|
|
|
|
|
|
|
для: winflip
(02.08.2007 в 16:01)
| | Удалить строку mysql_unbuffered_query("DELETE FROM `tbl_1`;")...
Но тогда во вторую таблицу будет постоянно добавлятся записи из первой. Там же нет "последних двух", там всегда максимум две. | |
|
|
|
|
|
|
|
для: Unkind
(02.08.2007 в 16:04)
| | нет я хочу чтобы если в первой таблице больше двух записей то переместить все кроме последних двух. скрипт будет вызываться кроном. | |
|
|
|
|
|
|
|
для: winflip
(02.08.2007 в 16:10)
| | Извините, я ошибся. Тогда нужно заменить запрос
на что-то вроде
DELETE FROM `tbl_1` WHERE `id` NOT IN (SELECT `id` FROM `tbl_1` ORDER BY `id` DESC LIMIT 2);
|
, где id - поле по которому можно определить, какие записи последние.
Правда старые версии MySQL не поддерживают LIMIT в подзапросах... | |
|
|
|
|
|
|
|
для: Unkind
(02.08.2007 в 16:16)
| | но проблема в том что эти 2 записи нельзя и записывать во вторую таблицу | |
|
|
|
|
|
|
|
для: winflip
(02.08.2007 в 16:20)
| | Запрос
INSERT INTO `tbl_2` (SELECT * FROM `tbl_1`);
|
Нужно изменить на что-то вроде
INSERT INTO `tbl_2` (SELECT * FROM `tbl_1` WHERE `id` NOT IN (SELECT `id` FROM `tbl_1` ORDER BY `id` DESC LIMIT 2));
|
| |
|
|
|
|
|
|
|
для: Unkind
(02.08.2007 в 16:23)
| | спасибо огромное | |
|
|
|
|
|
|
|
для: winflip
(02.08.2007 в 16:25)
| | Теперь вообще всё перестало работать ошибку не выдаёт а переносить не хочет | |
|
|
|
|
|
|
|
для: winflip
(02.08.2007 в 16:46)
| | помогите | |
|
|
|
|
|
|
|
для: winflip
(02.08.2007 в 16:46)
| | OK. Тогда можно
<?php
//...
mysql_unbuffered_query("INSERT INTO `tbl_2` SELECT * FROM `tbl_1` WHERE `id` NOT IN (SELECT `id` FROM `tbl_2`);");
mysql_unbuffered_query("DELETE FROM `tbl_1` ORDER BY `id` ASC LIMIT " . ($result - 2) . ";");
//...
?>
|
| |
|
|
|
|
|
|
|
для: Unkind
(02.08.2007 в 17:29)
| | спасибо попробую если что другую тему открою а то эта слишком длинная | |
|
|
|
|
|
|
|
для: winflip
(02.08.2007 в 17:32)
| | Если таблица не определена можно и так:
CREATE TABLE table_copy AS
SELECT * FROM table;
|
Таблицы table и table_copy будут иметь аналогичную структуру. | |
|
|
|
|
|
|
|
для: oradev
(03.08.2007 в 17:15)
| | спасибо всем всё заработало | |
|
|
|