За последние 24 часа нас посетили 23139 программистов и 1722 робота. Сейчас ищут 1823 программиста ...

Дублирование записи в таблице

Тема в разделе "PHP и базы данных", создана пользователем justc, 8 фев 2018.

  1. justc

    justc Активный пользователь

    С нами с:
    27 сен 2015
    Сообщения:
    130
    Симпатии:
    0
    Задача:

    При создании новости, дублировать ее во все остальные категории
    (допустим в остальные 9 из 10 категорий).

    План:

    1. Нужно получить id всех категорий и исключить id категории создаваемой новости.
    запрос к бд, но можно ли прям в запросе получить остальные 9 id ? или работать потом с массивом?

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

    увидел интересное решение

    Код (Text):
    1. CREATE TEMPORARY TABLE foo AS SELECT * FROM parts WHERE id = X;
    2. UPDATE foo SET id=NULL;
    3. INSERT INTO parts SELECT * FROM foo;
    4. DROP TABLE foo;
    какие тут могут быть подводные камни?
    как проще дублировать записи?
     
  2. abrdabr

    abrdabr Новичок

    С нами с:
    28 янв 2017
    Сообщения:
    774
    Симпатии:
    65
    неверная структура бд?
     
  3. justc

    justc Активный пользователь

    С нами с:
    27 сен 2015
    Сообщения:
    130
    Симпатии:
    0
    в момент создание новости??
     
  4. abrdabr

    abrdabr Новичок

    С нами с:
    28 янв 2017
    Сообщения:
    774
    Симпатии:
    65
    нет, я имел в виду общая структура не оптимальна, раз требуются дубли.
     
  5. justc

    justc Активный пользователь

    С нами с:
    27 сен 2015
    Сообщения:
    130
    Симпатии:
    0
    если коротко - мультисайт, нужно раскидывать одну новость во все сайты
     
  6. abrdabr

    abrdabr Новичок

    С нами с:
    28 янв 2017
    Сообщения:
    774
    Симпатии:
    65
    @justc если у них общая бд то действия такие же как при категориях... если бд разные то каждый скрипт сам решает чё добавлять.. но необходимость дублей я до сих пор не вижу
     
  7. justc

    justc Активный пользователь

    С нами с:
    27 сен 2015
    Сообщения:
    130
    Симпатии:
    0
    ну как бы, чтобы в каждой категории, каждая из которой относится к своему сайту, была физически новость (одинаковая)
    так логически в моем случае правильно

    можно было бы сделать общую категорию, но это уже надо логику менять, так как у меня категории привязываются к конкретному сайту
     
  8. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    Может вы что-то знаете, чего не известно нам, но вашу логику я уловить не могу. Создать отдельную таблицу с новостями и по ID привязывать к тем категориям/сайтам, где конкретная новость должна выводиться. Если у каждого сайта своя БД, то в конце концов, создать отдельную базу под новости.
    Если логика изначально не была правильной, то да - нужно менять и чем раньше, тем лучше.
     
    acho нравится это.
  9. justc

    justc Активный пользователь

    С нами с:
    27 сен 2015
    Сообщения:
    130
    Симпатии:
    0
    стоп, в коде выше создается временная таблица, чтобы дублировать запись
    это как интересный пример (когда нужно что-то поменять, обнулить id, поставить id другой категории).

    можно и просто INSERT INTO

    я и спрашиваю как лучше дублировать запись
     
    #9 justc, 8 фев 2018
    Последнее редактирование: 8 фев 2018
  10. acho

    acho Активный пользователь

    С нами с:
    28 дек 2016
    Сообщения:
    854
    Симпатии:
    210
    Адрес:
    Санкт-Петербург
    Никак не лучше дублировать записи. Если у тебя общая бд, зачем такое решение?
    Есть у тебя одна таблица со всеми новостями
    id | news
    1 | классная первая новость
    2 | и просто офигительная вторая
    3 | ну а третьей вообще равных нет

    И есть табличка с привязыванием новостей к сайтам:
    id | news | site
    1 | 1 | site1
    2 | 1 | site2
    3 | 2 | site1
    4 | 3 | site2

    т.е. первая новость сразу на первый и на второй сайт, вторая новость только на первый сайт, третья новость только на второй сайт
     
  11. justc

    justc Активный пользователь

    С нами с:
    27 сен 2015
    Сообщения:
    130
    Симпатии:
    0
    Давайте опустим логику.

    Вот такой план вырисовывается:

    при добавлении новости сделать галку "Копировать в другие сайты",
    после установки галки подгружать список всех сайтов, исключая текущий

    id выбранных сайтов идут в массив $allpid

    далее примерно так

    Код (Text):
    1. $id = id создаваемой новости
    2. $pid - parent id (категория новости/сайт)
    3. $allpid - массив из всех категорий, исключая $pid создаваемой новости
    4.  
    5.  
    6. CREATE TABLE testim AS SELECT * FROM news WHERE id = $id;
    7. TRUNCATE testim;
    8.  
    9.  
    10. foreach ($allpid as $pid) {
    11. INSERT INTO testim SELECT * FROM news WHERE id = $id;
    12. UPDATE testim SET id=NULL;
    13. UPDATE testim SET pid=$pid;
    14. }
    15.  
    16. INSERT INTO news SELECT * FROM testim;
    17.  
    18.  
    19.  
    20. DROP TABLE testim;
    так пойдет или можно как-то красивше сделать?