Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

[SOLUCIONADO] Actualizar datos de un campo con datos de varios campos

Estas en el tema de Actualizar datos de un campo con datos de varios campos en el foro de Mysql en Foros del Web. Hola de nuevo, Esta consulta es una continuación de la ya resuelta en http://www.forosdelweb.com/f86/actualizar-datos-columna-con-datos-otra-columna-otra-tabla-1067933 Ahí, gracias a la ayuda de Leo y la documentación de ...
  #1 (permalink)  
Antiguo 05/08/2013, 10:30
 
Fecha de Ingreso: junio-2008
Mensajes: 8
Antigüedad: 15 años, 10 meses
Puntos: 0
Actualizar datos de un campo con datos de varios campos

Hola de nuevo,

Esta consulta es una continuación de la ya resuelta en http://www.forosdelweb.com/f86/actualizar-datos-columna-con-datos-otra-columna-otra-tabla-1067933

Ahí, gracias a la ayuda de Leo y la documentación de MySQL, encontré un comando que me permite actualizar el valor del campo post_category de la tabla wp_posts con el valor del campo term_taxonomy_id de la tabla wp_term_relationships cuando el valor del campo ID de la tabla wp_posts es igual al valor del campo object_id de la tabla wp_term_relationships:

Código:
UPDATE wp_posts, wp_term_relationships
SET wp_posts.post_category=wp_term_relationships.term_taxonomy_id
WHERE wp_posts.ID = wp_term_relationships.object_id;
El problema es que esto sólo me sirve en los casos en que una entrada del sitio WP sólo tiene marcada una categoría. Cuando una entrada tiene marcadas dos o más categorías, este comando sólo actualiza el valor de la primera que encuentra.

Así que lo que necesito averiguar ahora es cómo actualizar el campo post_category de la tabla wp_post con todos los valores del campo term_taxonomy_id de la tabla wp_term_relationships en que el valor del campo ID de la tabla wp_posts sea igual al valor del campo object_id de la tabla wp_term_relationships. Y que en el campo post_category de la tabla wp_post los distintos valores sean separados por una coma o el separador que me recomendéis.

Notas importantes:
  1. El número de categorías marcadas en cada entrada de WP es variable (una, dos, tres, etc.).
  2. El resultado de esta consulta no será aplicado en seguir trabajando con dicha base de datos (ya he leído en varios hilos que eso no se recomienda hacerlo así en MySQL), sino en facilitar que el script .py de migración a Plone (CMS basado en Python y Zope) sea más sencillo.

¿Alguien puede darme una pista sobre las funciones o sentencias que tengo que estudiar para poder hacer esto? He leído hilos en que se hacen cosas parecidas con CONCAT, pero siempre con un número de valores y campos fijo. Y no he sabido encontrar ningún hilo o ejemplo análogo al que me interesa (probablemente, porque mi ignorancia sobre MySQL me haya impedido buscar las palabras clave adecuadas).

Gracias de nuevo por la atención y, en su caso, ayuda.

Saludos,

Manuel
  #2 (permalink)  
Antiguo 05/08/2013, 11:37
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Actualizar datos de un campo con datos de varios campos

Hola de nuevo aprendiz69:

Vayamos por partes... Si lo que pretendes hacer es tener un campo MULTIVALUADO, es decir, que en el campo wp_posts.post_category tengas asociadas todas las categorías definidas en tu tabla wp_term_relationships, OLVIDALO, en un modelo E-R NO DEBEN EXISTIR CAMPOS MULTIVARIADOS. Estos sólo te darán dolores de cabeza... ni lo pienses.

No sé exactamente qué es lo que quieres hacer... igual es conveniente que comiences por decirnos exactamente cuál es la estructura de tus tablas y que nos pongas algunos datos de ejemplo. Una vez que hagas esto, entonces nos expliques qué es lo que necesitas actualizar... es decir, cómo deberían quedar tus datos después de hacer el UPDATE... de esta manera será más fácil tratar de ayudarte a encontrar una alternativa que se ajuste a lo que necesitas.

Cita:
El problema es que esto sólo me sirve en los casos en que una entrada del sitio WP sólo tiene marcada una categoría. Cuando una entrada tiene marcadas dos o más categorías, este comando sólo actualiza el valor de la primera que encuentra.
Efectivamente, si tu relación entre tus tablas es 1 a N, el update actualizará sólo la primer ocurrencia, checa este ejemplo:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla1;
  2. +------+-----------+
  3. | id   | categoria |
  4. +------+-----------+
  5. |    1 | NULL      |
  6. |    2 | NULL      |
  7. |    3 | NULL      |
  8. +------+-----------+
  9. 3 rows in set (0.00 sec)
  10.  
  11. mysql> SELECT * FROM tabla2;
  12. +------+---------------+
  13. | id   | categoria     |
  14. +------+---------------+
  15. |    1 | categoria 1.1 |
  16. |    1 | categoria 1.2 |
  17. |    2 | categoria 2.1 |
  18. +------+---------------+
  19. 3 rows in set (0.00 sec)
  20.  
  21. mysql> UPDATE tabla1, tabla2 SET tabla1.categoria = tabla2.categoria
  22.     -> WHERE tabla1.id = tabla2.id;
  23. Query OK, 2 rows affected (0.04 sec)
  24. Rows matched: 2  Changed: 2  Warnings: 0
  25.  
  26. mysql> SELECT * FROM tabla1;
  27. +------+---------------+
  28. | id   | categoria     |
  29. +------+---------------+
  30. |    1 | categoria 1.1 |
  31. |    2 | categoria 2.1 |
  32. |    3 | NULL          |
  33. +------+---------------+
  34. 3 rows in set (0.00 sec)

Observa que aunque el ID = 1 TIENE ASOCIADAS DOS CATEGORÍAS (1.1 y 1.2), el resultado del UPDATE asigna sólo el primero.

Si lo que pretendes hacer es obtener algo como eso;

Código:
mysql> SELECT * FROM tabla1;
+------+-----------------------------+
| id   | categoria                   |
+------+-----------------------------+
|    1 | categoria 1.1,categoria 1.2 |
|    2 | categoria 2.1               |
|    3 | NULL                        |
+------+-----------------------------+
3 rows in set (0.00 sec)
Esto es un campo multivaluado y NO DEBEN HACERLO, no deben existir estos valores, no tienen ninguna ventaja... Podrías hacerlo (podría incluso poner el código SQL para hacerlo) pero insisto que no debe ser.

Si insistes en hacer algo como esto y te es imposible cambiar tu modelo, checa la función GROUP_CONCAT... pero por favor, sólo hazlo si en verdad no tienes otra opción.

Saludos
Leo.
  #3 (permalink)  
Antiguo 05/08/2013, 12:27
 
Fecha de Ingreso: junio-2008
Mensajes: 8
Antigüedad: 15 años, 10 meses
Puntos: 0
Respuesta: Actualizar datos de un campo con datos de varios campos

Gracias de nuevo por tu ayuda, Leo,

Estudiaré la función GROUP_CONCAT, pues en mi caso me interesa conseguir ese campo multivaluado para facilitar la migración del sitio WordPress a Plone (por lo que había leido y me has recalcado claramente, entiendo que, en condiciones normales, no es recomendable usar esto en MySQL, pero yo sólo lo voy a utilizar para facilitar la migración de WordPress -Php+MysQL- a Plone -Python+Zope-) (de hecho, usaré un campo distinto, creado sólo para esto y llamado 'categorias', además de trabajar en local con XAMPP, en vez de en el servidor).

Informaré sobre mis avances.

Gracias y saludos,

Manuel
  #4 (permalink)  
Antiguo 05/08/2013, 22:54
 
Fecha de Ingreso: junio-2008
Mensajes: 8
Antigüedad: 15 años, 10 meses
Puntos: 0
Respuesta: Actualizar datos de un campo con datos de varios campos

Hola de nuevo,

Después de estudiar la documentación recomendada, así como unos cuantos hilos de estos foros y otras páginas localizadas con buscadores, he encontrado un par de comandos que me permiten seleccionar y mostrar en campos multivaluados todos los valores de categorías y etiquetas de cada página y entrada (no sé si uno de los comandos es más adecuado o mejor que el otro: en mi caso generan los mismos resultados):

Código:
SELECT wp_posts.ID, GROUP_CONCAT( CONVERT( wp_term_relationships.term_taxonomy_id, CHAR( 8 ) ) ) AS categorias_y_etiquetas
FROM wp_posts
JOIN wp_term_relationships ON wp_term_relationships.object_id = wp_posts.ID
GROUP BY wp_posts.ID
Código:
SELECT wp_posts.ID, (
SELECT GROUP_CONCAT( CONVERT( wp_term_relationships.term_taxonomy_id, CHAR( 8 ) ) )
FROM wp_term_relationships
WHERE wp_posts.ID = wp_term_relationships.object_id
) AS categorias_y_etiquetas
FROM wp_posts
Además de la indicada por Leo, las páginas que me han resultado más útiles para lograr esto han sido:
  • http://www.forosdelweb.com/f86/faqs-mysql-489891/#post3015306
  • http://stackoverflow.com/questions/2133936/using-group-concat-in-phpmyadmin-will-show-the-result-as-blob-3b

Ahora, antes de estudiar cómo usar esto con UPDATE y SET, me gustaría saber si existe la posibilidad de separar los valores que corresponden a categorías de los que corresponden a etiquetas (es decir, obtener un campo multivaluado con todos los valores que WP marca como category y otro campo multivaluado con todos los valores que WP marca como post_tag).

Me explico:

En mi versión de WP, tengo las siguientes tablas y campos:

wp_posts
· ID
· post_category

wp_term_relationships
· object_id
· term_taxonomy_id

wp_term_taxonomy
· term_taxonomy_id
· taxonomy

Hasta el momento he trabajado con las primeras dos tablas, pero ahora me gustaría trabajar también con la tercera (wp_term_taxonomy), ya que su campo taxonomy es el que indica si el término es una categoría (category) o es una etiqueta (post_tag).

Es decir, me gustaría poder obtener un campo multivaluado (categorias) que incluyera los valores de todas las categorías de cada entrada WP (definidas como category en taxonomy) y otro campo multivaluado distinto (etiquetas) con los valores de todas las etiquetas de cada entrada WP (definidas como post_tag en taxonomy).

Si esto fuera posible, ¿podríais ayudarme indicándome cuáles son las palabras clave o manuales a estudiar?

Gracias de nuevo por la ayuda (especialmente a Leo) y saludos cordiales,

Manuel
  #5 (permalink)  
Antiguo 06/08/2013, 13:29
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Actualizar datos de un campo con datos de varios campos

Hola de nuevo aprendiz69:

Nuevamente olvidas decirnos cómo están relacionadas tus tablas... es decir, colocas los campos y la estructura parcial de tus tablas, pero no nos dices si cardinalidad de tus relaciones es 1-1 o 1-N... de esta información depende la manera en que debes hacer tu consulta...

Suponiendo que tienes una relación 1-1 entre tus tablas, podrías hacer lo siguiente:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla1;
  2. +------+-------------+
  3. | id   | descripcion |
  4. +------+-------------+
  5. |    1 | uno         |
  6. |    2 | dos         |
  7. |    3 | tres        |
  8. +------+-------------+
  9. 3 rows in set (0.00 sec)
  10.  
  11. mysql> SELECT * FROM tabla2;
  12. +------+---------------+
  13. | id   | categoria     |
  14. +------+---------------+
  15. |    1 | categoria 1.1 |
  16. |    1 | categoria 1.2 |
  17. |    2 | categoria 2.1 |
  18. +------+---------------+
  19. 3 rows in set (0.00 sec)
  20.  
  21. mysql> SELECT * FROM tabla3;
  22. +---------------+----------------+
  23. | categoria     | etiqueta       |
  24. +---------------+----------------+
  25. | categoria 1.1 | etiqueta 1.1.1 |
  26. | categoria 1.2 | etiqueta 1.2.1 |
  27. | categoria 2.1 | etiqueta 2.1.1 |
  28. +---------------+----------------+
  29. 3 rows in set (0.00 sec)
  30.  
  31. mysql> SELECT
  32.     ->    tabla1.id, tabla1.descripcion,
  33.     ->    GROUP_CONCAT(tabla2.categoria) categorias,
  34.     ->    GROUP_CONCAT(tabla3.etiqueta) etiquetas
  35.     -> FROM tabla1
  36.     -> INNER JOIN tabla2 ON tabla1.id = tabla2.id
  37.     -> INNER JOIN tabla3 ON tabla2.categoria = tabla3.categoria
  38.     -> GROUP BY tabla1.id, tabla1.descripcion;
  39. +------+-------------+-----------------------------+-------------------------------+
  40. | id   | descripcion | categorias                  | etiquetas   |
  41. +------+-------------+-----------------------------+-------------------------------+
  42. |    1 | uno         | categoria 1.2,categoria 1.1 | etiqueta 1.2.1,etiqueta 1.1.1 |
  43. |    2 | dos         | categoria 2.1               | etiqueta 2.1.1   |
  44. +------+-------------+-----------------------------+-------------------------------+
  45. 2 rows in set (0.00 sec)

es decir, simplemente agregas la tabla como un INNER JOIN adicional y con eso queda listo, sin embargo, si tienes una relación de 1-n, es decir, que cada categoría tuviera más de una etiqueta entonces esta consulta no te serviría... observa qué pasaría con los siguientes datos:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla3;
  2. +---------------+----------------+
  3. | categoria     | etiqueta       |
  4. +---------------+----------------+
  5. | categoria 1.1 | etiqueta 1.1.1 |
  6. | categoria 1.1 | etiqueta 1.1.2 |
  7. | categoria 2.1 | etiqueta 2.1.1 |
  8. | categoria 2.1 | etiqueta 2.1.2 |
  9. +---------------+----------------+
  10. 4 rows in set (0.00 sec)
  11.  
  12. mysql> SELECT
  13.     ->    tabla1.id, tabla1.descripcion,
  14.     ->    GROUP_CONCAT(tabla2.categoria) categorias,
  15.     ->    GROUP_CONCAT(tabla3.etiqueta) etiquetas
  16.     -> FROM tabla1
  17.     -> INNER JOIN tabla2 ON tabla1.id = tabla2.id
  18.     -> INNER JOIN tabla3 ON tabla2.categoria = tabla3.categoria
  19.     -> GROUP BY tabla1.id, tabla1.descripcion;
  20. +------+-------------+-----------------------------+-------------------------------+
  21. | id   | descripcion | categorias                  | etiquetas   |
  22. +------+-------------+-----------------------------+-------------------------------+
  23. |    1 | uno         | categoria 1.1,categoria 1.1 | etiqueta 1.1.2,etiqueta 1.1.1 |
  24. |    2 | dos         | categoria 2.1,categoria 2.1 | etiqueta 2.1.1,etiqueta 2.1.2 |
  25. +------+-------------+-----------------------------+-------------------------------+
  26. 2 rows in set (0.00 sec)

Observa que en la columna CATEGORIAS se están repitiendo descripciones... lo cual no es correcto... Finalmente, deberías considerar las siguientes situaciones:

1. todos los elementos de tu tabla wp_posts tienen una relación con 1 o más elementos de tu tabla wp_term_relationships, o puede haber elementos sin relaciones?...

2. Lo mismo para tus tablas wp_term_relationships. ¿puede haber elementos en esta tabla que no tengan asociados wp_term_taxonomy?

Dependiendo de estas respuestas será la complejidad de la consulta...

Finalmente, sería conveniente que nos pusieras además de las estructuras de tus tablas, algunos datos de ejemplo... es más sencillo visualizar tu problema y una posible solución a partir de datos reales, no inventados como es este caso...

Saludos
Leo.
  #6 (permalink)  
Antiguo 07/08/2013, 10:37
 
Fecha de Ingreso: junio-2008
Mensajes: 8
Antigüedad: 15 años, 10 meses
Puntos: 0
Respuesta: Actualizar datos de un campo con datos de varios campos

Gracias, Leo,

Intentaré explicar lo mejor posible las características de las tablas que me interesan (lo de la cardinalidad 1-1 vs 1-n ni tan siquiera sabía lo que era: recuerda mi ignorancia cuasiabsoluta en materia de MySQL)).

En mi primer hilo sólo hice referencia a dos tablas, en este segundo hilo ya incluí una tercera y ahora incluyo la cuarta y última que me interesa. No es que las desconociera al principio, es que como no tengo ni idea de MySQL preferí ir poquito a poco, empezar y comprender cosas sencillas, antes de liarme con las más complejas (mi planteamiento no era llegar aquí y pedir que me resolvieran lo complejo, sino solicitar ayuda para ir comprendiendo y encontrando soluciones, paso a paso, desde lo más sencillo hasta lo más complicado). Ahora las pongo todas, ya que me has solicitado información detallada.

Primera tabla (wp_posts)

Código:
CREATE TABLE IF NOT EXISTS `wp_posts` (
  `ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `post_author` bigint(20) NOT NULL DEFAULT '0',
  `post_date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `post_date_gmt` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `post_content` longtext NOT NULL,
  `post_title` text NOT NULL,
  `post_category` int(4) NOT NULL DEFAULT '0',
  `post_excerpt` text NOT NULL,
  `post_status` varchar(20) NOT NULL DEFAULT 'publish',
  `comment_status` varchar(20) NOT NULL DEFAULT 'open',
  `ping_status` varchar(20) NOT NULL DEFAULT 'open',
  `post_password` varchar(20) NOT NULL DEFAULT '',
  `post_name` varchar(200) NOT NULL DEFAULT '',
  `to_ping` text NOT NULL,
  `pinged` text NOT NULL,
  `post_modified` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `post_modified_gmt` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `post_content_filtered` text NOT NULL,
  `post_parent` bigint(20) NOT NULL DEFAULT '0',
  `guid` varchar(255) NOT NULL DEFAULT '',
  `menu_order` int(11) NOT NULL DEFAULT '0',
  `post_type` varchar(20) NOT NULL DEFAULT 'post',
  `post_mime_type` varchar(100) NOT NULL DEFAULT '',
  `comment_count` bigint(20) NOT NULL DEFAULT '0',
  PRIMARY KEY (`ID`),
  KEY `post_name` (`post_name`),
  KEY `type_status_date` (`post_type`,`post_status`,`post_date`,`ID`),
  KEY `post_parent` (`post_parent`)
)
Esta tabla es la que incluye la información principal de cada post (ID, autor, título, contenido, etc.).

De esta tabla, el campo que me interesa es el primero: ID (el identificador de cada post).

Del campo post_category podemos olvidarnos, ya que sólo incluye un número entero correspondiente a una categoría, mientras que hay muchos posts que tienen varias categorías (este campo creo que es una herencia de antiguas versiones WP, antes de que éste empezara a usar taxonomy).

Ejemplo de selección de lo que me interesa:

Código:
mysql> SELECT ID FROM `wp_posts` LIMIT 0 , 10;
+----+
| ID |
+----+
|  1 |
|  2 |
|  3 |
|  4 |
|  5 |
|  6 |
|  7 |
|  8 |
|  9 |
| 10 |
+----+
10 rows in set (0.00 sec)
Segunda tabla (wp_terms)

Código:
CREATE TABLE IF NOT EXISTS `wp_terms` (
  `term_id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(200) NOT NULL DEFAULT '',
  `slug` varchar(200) NOT NULL DEFAULT '',
  `term_group` bigint(10) NOT NULL DEFAULT '0',
  PRIMARY KEY (`term_id`),
  UNIQUE KEY `slug` (`slug`),
  KEY `name` (`name`)
)
Esta tabla es la que incluye la información general de los términos (categorías y etiquetas), pero sin diferenciar entre sus distintos tipos (category, post_tag).

Los campos que me interesan son term_id y name.

El valor del campo term_id de esta tabla siempre es igual al de su campo homónimo de la tabla wp_term_taxonomy (wp_terms.term_id = wp_term_taxonomy.term_id).

Ejemplo de selección de lo que me interesa:

Código:
mysql> SELECT term_id, name FROM `wp_terms` LIMIT 0 , 10;
+---------+-------------+
| term_id | name        |
+---------+-------------+
|       1 | Categoría 1 |
|       2 | Categoría 2 |
|       3 | Categoría 3 |
|       4 | Categoría 4 |
|       5 | Categoría 5 |
|       6 | Categoría 6 |
|       7 | Etiqueta 1  |
|       8 | Etiqueta 2  |
|       9 | Etiqueta 3  |
|      10 | Etiqueta 4  |
+---------+-------------+
10 rows in set (0.00 sec)
Tercera tabla (wp_term_relationships)

Código:
CREATE TABLE IF NOT EXISTS `wp_term_relationships` (
  `object_id` bigint(20) NOT NULL DEFAULT '0',
  `term_taxonomy_id` bigint(20) NOT NULL DEFAULT '0',
  `term_order` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`object_id`,`term_taxonomy_id`),
  KEY `term_taxonomy_id` (`term_taxonomy_id`)
)
Esta tabla es la que relaciona los posts (object_id) con los taxones (term_taxonomy_id).

El valor del campo object_id de esta tabla siempre es igual al del campo ID de la tabla wp_posts (wp_term_relationships.object_id = wp_posts.ID).

El valor del campo term_taxonomy_id de esta tabla siempre es igual al de su campo homónimo de la tabla wp_term_taxonomy (wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id).

Como vemos abajo, un mismo post (object.id) puede estar relacionado con varios taxones (term_taxonomy_id).

Ejemplo de selección de lo que me interesa:

Código:
mysql> SELECT object_id, term_taxonomy_id FROM `wp_term_relationships` LIMIT 0 , 10;
+-----------+------------------+
| object_id | term_taxonomy_id |
+-----------+------------------+
|         1 |                1 |
|         2 |                1 |
|         2 |                2 |
|         3 |                1 |
|         3 |                2 |
|         3 |                3 |
|         4 |                1 |
|         4 |                2 |
|         4 |                3 |
|         4 |                4 |
+-----------+------------------+
10 rows in set (0.00 sec)
Cuarta tabla (wp_term_taxonomy)

Código:
CREATE TABLE IF NOT EXISTS `wp_term_taxonomy` (
  `term_taxonomy_id` bigint(20) NOT NULL AUTO_INCREMENT,
  `term_id` bigint(20) NOT NULL DEFAULT '0',
  `taxonomy` varchar(32) NOT NULL DEFAULT '',
  `description` longtext NOT NULL,
  `parent` bigint(20) NOT NULL DEFAULT '0',
  `count` bigint(20) NOT NULL DEFAULT '0',
  PRIMARY KEY (`term_taxonomy_id`),
  UNIQUE KEY `term_id_taxonomy` (`term_id`,`taxonomy`)
)
Esta tabla es la que relaciona taxones, términos y taxonomía (tipo de taxón).

De ella sólo me interesan tres campos: term_taxonomy_id, term_id y taxonomy.

El valor del campo term_taxonomy_id de esta tabla siempre es igual al del campo homónimo de la tabla wp_term_relationships (wp_term_taxonomy.term_taxonomy_id = wp_term_relationships.term_taxonomy_id).

El valor del campo term_id de esta tabla siempre es igual al de su campo homónimo de la tabla wp_terms (wp_term_taxonomy.term_id = wp_terms.term_id).

En cambio, los valores de los campos term_taxonomy_id y term_id de esta tabla pueden ser distintos.

Ejemplo de selección de lo que me interesa:

Código:
mysql> SELECT term_taxonomy_id, term_id, taxonomy FROM `wp_term_taxonomy` LIMIT 0 , 10;
+------------------+---------+----------+
| term_taxonomy_id | term_id | taxonomy |
+------------------+---------+----------+
|                1 |       1 | category |
|                2 |       2 | category |
|                3 |       3 | category |
|                4 |       4 | category |
|                5 |       5 | category |
|                6 |       6 | category |
|                7 |       7 | post_tag |
|                8 |       8 | post_tag |
|                9 |       9 | post_tag |
|               10 |      10 | post_tag |
+------------------+---------+----------+
10 rows in set (0.00 sec)
Finalmente, en respuesta a tus preguntas:
1.- Todos los elementos de la tabla wp_posts tienen relación con uno o más elementos de la tabla wp_term_relationships.
2.- Cada elemento de la tabla wp_term_relationships tiene relación con un elemento de la tabla wp_term_taxonomy.
3.- Cada elemento de la tabla wp_term_taxonomy tiene relación con un elemento de la tabla wp_terms.

Sigo en el próximo mensaje, que éste tenía más de 10.000 caracteres...
  #7 (permalink)  
Antiguo 07/08/2013, 10:42
 
Fecha de Ingreso: junio-2008
Mensajes: 8
Antigüedad: 15 años, 10 meses
Puntos: 0
Respuesta: Actualizar datos de un campo con datos de varios campos

Lo que busco es un comando que genere los siguientes resultados:
Código:
+----+-------------------------------------------------+----------------------------------+
| ID | categorias                                      | etiquetas                        |
+----+-------------------------------------------------+----------------------------------+
|  1 | Categoría 1                                     | NULL                             |
|  2 | Categoría 1,Categoría 2                         | NULL                             |
|  3 | Categoría 1,Categoría 2,Categoría 3             | NULL                             |
|  4 | Categoría 1,Categoría 2,Categoría 3,Categoría 4 | NULL                             |
|  5 | Categoría 5,Categoría 6                         | Etiqueta 1                       |
|  6 | Categoría 7                                     | Etiqueta 1,Etiqueta 2            |
|  7 | Categoría 8                                     | Etiqueta 3                       |
|  8 | Categoría 1,Categoría 9                         | Etiqueta 1,Etiqueta 5            |
|  9 | NULL                                            | Etiqueta 4                       |
| 10 | NULL                                            | Etiqueta 1,Etiqueta 2,Etiqueta 3 |
+----+-------------------------------------------------+----------------------------------+
En el que:
  1. ID = wp_posts.ID (cuyos valores son los mismos que los de wp_term_relationships.object_id).
  2. 'categorias' es un campo multivaluado que incluye los nombres de las categorías relacionadas con cada ID.
  3. 'etiquetas' es un campo multivaluado que incluye los nombres de las etiquetas relacionadas con cada ID.

Para la obtención de las categorías de cada ID hay que recopilar los term_taxonomy_id que tiene cada object_id en la tabla wp_term_relationships que tengan asociado el valor category en el campo taxonomy de la tabla wp_term_taxonomy y mostrar el name que tengan en la tabla wp_terms correspondiente a su term_id.

Para la obtención de las etiquetas es igual pero cambiando category por post_tag.

Espero haberme explicado correctamente.

Además de los JOIN también he estado probando con CASE WHEN END, pero de momento no he sido capaz de lograr nada.

Gracias de nuevo por la ayuda y saludos cordiales,

Manuel
  #8 (permalink)  
Antiguo 09/08/2013, 13:44
 
Fecha de Ingreso: junio-2008
Mensajes: 8
Antigüedad: 15 años, 10 meses
Puntos: 0
Respuesta: Actualizar datos de un campo con datos de varios campos

Hola de nuevo,

Como me daba la impresión de que este comando sería bastante complicado de elaborar, finalmente he resuelto el problema al estilo de la montaña y Mahoma:

En primer lugar, he creado los campos taxonomy, term_id y name en la tabla wp_term_relationships:
Código:
ALTER TABLE wp_term_relationships ADD COLUMN taxonomy varchar(32) NOT NULL DEFAULT '' AFTER term_taxonomy_id;
ALTER TABLE wp_term_relationships ADD COLUMN term_id bigint(20) NOT NULL DEFAULT '0' AFTER taxonomy;
ALTER TABLE wp_term_relationships ADD COLUMN name varchar(200) NOT NULL DEFAULT '' AFTER term_id;
Después, he actualizado los campos term_id y taxonomy de la tabla wp_term_relationships desde la tabla wp_term_taxonomy tomando como referencia el campo term_taxonomy_id de ambas tablas:
Código:
UPDATE wp_term_relationships, wp_term_taxonomy
SET wp_term_relationships.taxonomy = wp_term_taxonomy.taxonomy, wp_term_relationships.term_id = wp_term_taxonomy.term_id
WHERE wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id;
A continuación, he actualizado el campo name de la tabla wp_term_relationships desde la tabla wp_terms tomando como referencia el campo term_id de ambas tablas:
Código:
UPDATE wp_term_relationships, wp_terms
SET wp_term_relationships.name = wp_terms.name
WHERE wp_term_relationships.term_id = wp_terms.term_id;
Después, he creado los campos categories y tags en la tabla wp_posts (longtext para permitir que quepan todas las categorías y etiquetas cuando las páginas y entradas tengan muuuuchas):
Código:
ALTER TABLE wp_posts ADD COLUMN tags longtext CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' AFTER post_title;
ALTER TABLE wp_posts ADD COLUMN categories longtext CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' AFTER post_title;
A continuación, he importado en modo multivaluado los nombres de categorías y etiquetas a los campos categories y tags de la tabla wp_posts:
Código:
UPDATE wp_posts
SET wp_posts.categories =
(SELECT GROUP_CONCAT(DISTINCT
CASE WHEN wp_term_relationships.taxonomy = 'category'
THEN wp_term_relationships.name END
ORDER BY wp_term_relationships.term_taxonomy_id
SEPARATOR "|")
FROM wp_term_relationships
WHERE wp_posts.ID = wp_term_relationships.object_id
GROUP BY wp_posts.ID)
Código:
UPDATE wp_posts
SET wp_posts.tags =
(SELECT GROUP_CONCAT(DISTINCT
CASE WHEN wp_term_relationships.taxonomy = 'post_tag'
THEN wp_term_relationships.name END
ORDER BY wp_term_relationships.term_taxonomy_id
SEPARATOR "|")
FROM wp_term_relationships
WHERE wp_posts.ID = wp_term_relationships.object_id
GROUP BY wp_posts.ID)
Y, finalmente, he comprobado que todo ha ido bien:
Código:
SELECT ID, post_title, categories, tags FROM wp_posts ORDER BY ID;
Ha quedado perfecto, tal y como quería tenerlo para facilitar la migración a Plone.



Gracias de nuevo a Leo por la ayuda prestada y saludos cordiales,

Manuel

Etiquetas: campos, sql, tablas, update
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 03:35.