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

Ayuda query SQL

Estas en el tema de Ayuda query SQL en el foro de Bases de Datos General en Foros del Web. Buenas, aquí primero que nada os expongo la estructura de la tabla a la cual quiero hacerle una consulta: Código: -- -- Estructura de tabla ...
  #1 (permalink)  
Antiguo 03/11/2009, 15:36
 
Fecha de Ingreso: octubre-2008
Mensajes: 46
Antigüedad: 15 años, 7 meses
Puntos: 0
Ayuda query SQL

Buenas, aquí primero que nada os expongo la estructura de la tabla a la cual quiero hacerle una consulta:

Código:
--
-- Estructura de tabla para la tabla `mapreg`
--

CREATE TABLE IF NOT EXISTS `mapreg` (
  `varname` varchar(32) NOT NULL,
  `index` int(11) unsigned NOT NULL default '0',
  `value` varchar(255) NOT NULL,
  KEY `varname` (`varname`),
  KEY `index` (`index`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
Ahora bien, necesito saber el contenido de `varname` = $top1pvp$, $top2pvp$, $top3pvp$, $top4pvp$, $top5pvp$ y el `value` de cada una, es decir... Son variables que usa un programa que mendiante SQL lo va almacenando en la base de datos, y yo quiero con PHP usar los datos que exporta el programa, ya el nombre de las `varname` expone el orden en el que deben ser impresas.

1.- $top1pvp$ = $top1pvp
2.- $top2pvp$ = $top2pvp
3.- $top3pvp$ = $top3pvp
4.- $top4pvp$ = $top4pvp
5.- $top5pvp$ = $top5pvp

Como vemos poner $top1pvp$ (sería la variable del programa que almacena el nombre) = $top1pvp (la variable del programa que almacena un integer), y la variable se gestiona `varname` es el nombre de la variable del programa y `value` el contenido de la misma.

Resumen: Lo que quiero hacer es eso, imprimir esas variables de esa forma haciendo la consulta.

Gracias de antemano.
  #2 (permalink)  
Antiguo 03/11/2009, 15:56
Avatar de webness  
Fecha de Ingreso: enero-2009
Ubicación: BOGOTA
Mensajes: 312
Antigüedad: 15 años, 3 meses
Puntos: 5
Respuesta: Ayuda query SQL

amigo he leido esto como 3 veces y no entiendo muy bien
  #3 (permalink)  
Antiguo 03/11/2009, 16:02
Avatar de webness  
Fecha de Ingreso: enero-2009
Ubicación: BOGOTA
Mensajes: 312
Antigüedad: 15 años, 3 meses
Puntos: 5
Respuesta: Ayuda query SQL

exactamente que valores e guardan en varname y en value, y que salida quieres generar?

SELECT CONCAT (varname,' = ',value)
FROM mapreg
ORDER BY index ASC

Asumiendo que index es un campo que indica la posicion u orden en el que se deben listaar los registros
  #4 (permalink)  
Antiguo 03/11/2009, 16:04
Avatar de webness  
Fecha de Ingreso: enero-2009
Ubicación: BOGOTA
Mensajes: 312
Antigüedad: 15 años, 3 meses
Puntos: 5
Respuesta: Ayuda query SQL

en el query anterior obtienes por cada fila una cadena del tipo "varname=valor"

ahora si quieres por cada fila 3 columnas

SELECT varname,'=',value
FROM mapreg
  #5 (permalink)  
Antiguo 03/11/2009, 16:29
 
Fecha de Ingreso: octubre-2008
Mensajes: 46
Antigüedad: 15 años, 7 meses
Puntos: 0
Respuesta: Ayuda query SQL

Lo que quiero es pillar las varname = $top1pvp,$top1pvp$,$top2pvp,$top2pvp$,$top3pvp,$to p3pvp$,$top4pvp,$top4pvp$,$top5pvp,$top5pvp$ y su correspondiente value y luego imprimirlas como el orden que dije antes.

EDIT:
*** No puedo poner imágenes.

Como vemos en la imagen hay unos recuadrados rojos, pues eso es lo que quiero capturar de la consulta.

Última edición por rokimoki; 03/11/2009 a las 16:35
  #6 (permalink)  
Antiguo 03/11/2009, 16:38
 
Fecha de Ingreso: octubre-2008
Mensajes: 46
Antigüedad: 15 años, 7 meses
Puntos: 0
Respuesta: Ayuda query SQL

El index almacena una ID pero sólo en algunos datos no todos, olvida el index de momento. Sólo quiero hacer lo anterior dicho.
  #7 (permalink)  
Antiguo 04/11/2009, 02:28
 
Fecha de Ingreso: octubre-2008
Mensajes: 46
Antigüedad: 15 años, 7 meses
Puntos: 0
Respuesta: Ayuda query SQL

Ayuda por favor =]
  #8 (permalink)  
Antiguo 04/11/2009, 06:19
 
Fecha de Ingreso: octubre-2008
Mensajes: 46
Antigüedad: 15 años, 7 meses
Puntos: 0
Respuesta: Ayuda query SQL

A ver si ya puedo publicar imágenes....



Eso es lo que quiero, caputarar esas VARNAME que siempre serán fijas e imprimir el VALUE de las mismas, que es lo que va a variar.
  #9 (permalink)  
Antiguo 04/11/2009, 06:52
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Ayuda query SQL

En el lenguaje coloquial de mi país, lo que quieres hacer es "un merenge" entre PHP y SQL, desperdiciando completamente las capacidades de ambos.
Quieres poner en una tabla:
- Las variables que usas para realizar un cierto proceso.
- Un valor INDEX (al margen de usar una palabra reservada que te causará problemas) cuyo destino no queda claro.
- Un campo que no responde a un dominio de datos, sino a una selección arbitraria de valores.

Rokimoki: No sólo estás violando el modelo de bases de datos relacionales y elementos fundamentales de las bases de datos: Estás desperdiciando la capacidad de PHP de crear dinámicamente los objetos que te pueden dar ese mismo resultado y que no requieren hacer un híbrido SQL-PHP como el que pretendes.

¿Estás seguro de estar usando el mejor método posible para lograr lo que quieres?

Se te podría dar mejores consejos si partimos desde el inicio de lo que entra y de lo que quieres lograr mostrar.
A mi entender no te estás planteando bien las cosas.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #10 (permalink)  
Antiguo 04/11/2009, 07:08
 
Fecha de Ingreso: octubre-2008
Mensajes: 46
Antigüedad: 15 años, 7 meses
Puntos: 0
Respuesta: Ayuda query SQL

Realmente lo que estoy haciendo no tiene nada que ver con PhP ni SQL pero he programado de tal manera que guarde en una base de datos estos datos que consigo a través del programa para poderlo exponerlo en una página web.

Y tienes razón en todo, no tengo ningún estudio de bases de datos SQL ni nada por el estilo, lo cual no me meto en esta programación ya aprenderé con la universidad más adelante.

Sé que lo que he planteado se puede hacer aprovechando o sin aprovechar la totalidad del lenguaje, simplemente quiero hacerlo y necesito vuestra ayuda porque simplemente es un addon para una página web no quiero hacer ningún diseño de un programa en PHP y SQL.

Gracias por tu respuesta. Y por cierto, las varname son con $ por el programa y no por PHP, de todos modos, si me ayudan a hacer las consultas quizá pueda modificar cosas del programa para poder "mejorarlo".
  #11 (permalink)  
Antiguo 04/11/2009, 07:21
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Ayuda query SQL

Bien, empecemos desde el principio:
En primer lugar, ¿qué estás usando para programar y realizar la inserción de datos y la consulta a la base de datos?

En segundo lugar, La tabla que almacene los datos como mucho requiere tres campos, de los cuales dos son numéricos, a los cuales podríamos agregar un ID con funciones de ordenamiento por entrada de lo que luego se leerá:
Código sql:
Ver original
  1. CREATE TABLE IF NOT EXISTS `mapreg` (
  2.    `mapreg_id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
  3.     `var_1` INT USINGNED NOT NULL,
  4.     `var_2` INT USINGNED NOT NULL,
  5.    `value` VARCHAR(255) NOT NULL
  6. ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
Ese sería el formato lógico para un caso como el tuyo desde el punto de vista del diseño de bases de datos.
La pregunta que resta responder es cómo pasar los datos a las variables, pero para eso necesito saber en qué lenguaje o con qué medios pasas los datos desde un formulario a la base.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #12 (permalink)  
Antiguo 04/11/2009, 08:06
 
Fecha de Ingreso: octubre-2008
Mensajes: 46
Antigüedad: 15 años, 7 meses
Puntos: 0
Respuesta: Ayuda query SQL

Uso C/C++ para esto, pero la cosa es que necesito la estructura intacta en un principio.

Código:
/// Modifica el valor de una variable INTEGER
bool mapreg_setreg(int uid, int val)
{
	int num = (uid & 0x00ffffff);
	int i   = (uid & 0xff000000) >> 24;
	const char* name = get_str(num);

	if( val != 0 )
	{
		if( idb_put(mapreg_db,uid,(void*)val) )
			;
		else
		if( name[1] == '@' )
			; 
		else
		{
			char tmp_str[32*2+1];
			Sql_EscapeStringLen(mmysql_handle, tmp_str, name, strnlen(name, 32));
			if( SQL_ERROR == Sql_Query(mmysql_handle, "INSERT INTO `%s`(`varname`,`index`,`value`) VALUES ('%s','%d','%d')", mapreg_table, tmp_str, i, val) )
				Sql_ShowDebug(mmysql_handle);
		}
	}
	else // val == 0
	{
		idb_remove(mapreg_db,uid);

		if( name[1] == '@' )
			;
		else
		{
			if( SQL_ERROR == Sql_Query(mmysql_handle, "DELETE FROM `%s` WHERE `varname`='%s' AND `index`='%d'", mapreg_table, name, i) )
				Sql_ShowDebug(mmysql_handle);
		}
	}

	mapreg_dirty = true;
	return true;
}

/// Modifica el valor de una variable STRING
bool mapreg_setregstr(int uid, const char* str)
{
	int num = (uid & 0x00ffffff);
	int i   = (uid & 0xff000000) >> 24;
	const char* name = get_str(num);
	
	if( str == NULL || *str == 0 )
	{
		if(name[1] != '@') {
			if( SQL_ERROR == Sql_Query(mmysql_handle, "DELETE FROM `%s` WHERE `varname`='%s' AND `index`='%d'", mapreg_table, name, i) )
				Sql_ShowDebug(mmysql_handle);
		}
		idb_remove(mapregstr_db,uid);
	}
	else
	{
		if (idb_put(mapregstr_db,uid, aStrdup(str)))
			;
		else if(name[1] != '@') {
			char tmp_str[32*2+1];
			char tmp_str2[255*2+1];
			Sql_EscapeStringLen(mmysql_handle, tmp_str, name, strnlen(name, 32));
			Sql_EscapeStringLen(mmysql_handle, tmp_str2, str, strnlen(str, 255));
			if( SQL_ERROR == Sql_Query(mmysql_handle, "INSERT INTO `%s`(`varname`,`index`,`value`) VALUES ('%s','%d','%s')", mapreg_table, tmp_str, i, tmp_str2) )
				Sql_ShowDebug(mmysql_handle);
		}
	}

	mapreg_dirty = true;
	return true;
}

/// Carga la variable permanente de la base de datos
static void script_load_mapreg(void)
{
	/*
	        0        1       2
	   +-------------------------+
	   | varname | index | value |
	   +-------------------------+
	                                */
	SqlStmt* stmt = SqlStmt_Malloc(mmysql_handle);
	char varname[32+1];
	int index;
	char value[255+1];
	uint32 length;

	if ( SQL_ERROR == SqlStmt_Prepare(stmt, "SELECT `varname`, `index`, `value` FROM `%s`", mapreg_table)
	  || SQL_ERROR == SqlStmt_Execute(stmt)
	  ) {
		SqlStmt_ShowDebug(stmt);
		SqlStmt_Free(stmt);
		return;
	}

	SqlStmt_BindColumn(stmt, 0, SQLDT_STRING, &varname[0], 32, &length, NULL);
	SqlStmt_BindColumn(stmt, 1, SQLDT_INT, &index, 0, NULL, NULL);
	SqlStmt_BindColumn(stmt, 2, SQLDT_STRING, &value[0], 255, NULL, NULL);
	
	while ( SQL_SUCCESS == SqlStmt_NextRow(stmt) )
	{
		int s = add_str(varname);
		int i = index;

		if( varname[length-1] == '$' )
			idb_put(mapregstr_db, (i<<24)|s, aStrdup(value));
		else
			idb_put(mapreg_db, (i<<24)|s, (void *)atoi(value));
	}
	
	SqlStmt_Free(stmt);

	mapreg_dirty = false;
}

/// Guarda la variable permanente en la Base de Datos
static void script_save_mapreg(void)
{
	DBIterator* iter;
	void* data;
	DBKey key;

	iter = mapreg_db->iterator(mapreg_db);
	for( data = iter->first(iter,&key); iter->exists(iter); data = iter->next(iter,&key) )
	{
		int num = (key.i & 0x00ffffff);
		int i   = (key.i & 0xff000000) >> 24;
		const char* name = get_str(num);

		if( name[1] == '@' )
			continue;

		if( SQL_ERROR == Sql_Query(mmysql_handle, "UPDATE `%s` SET `value`='%d' WHERE `varname`='%s' AND `index`='%d'", mapreg_table, (int)data, name, i) )
			Sql_ShowDebug(mmysql_handle);
	}
	iter->destroy(iter);

	iter = mapregstr_db->iterator(mapregstr_db);
	for( data = iter->first(iter,&key); iter->exists(iter); data = iter->next(iter,&key) )
	{
		int num = (key.i & 0x00ffffff);
		int i   = (key.i & 0xff000000) >> 24;
		const char* name = get_str(num);
		char tmp_str2[2*255+1];

		if( name[1] == '@' )
			continue;

		Sql_EscapeStringLen(mmysql_handle, tmp_str2, (char*)data, safestrnlen((char*)data, 255));
		if( SQL_ERROR == Sql_Query(mmysql_handle, "UPDATE `%s` SET `value`='%s' WHERE `varname`='%s' AND `index`='%d'", mapreg_table, tmp_str2, name, i) )
			Sql_ShowDebug(mmysql_handle);
	}
	iter->destroy(iter);

	mapreg_dirty = false;
}
Aquí tienes el código que hago para hacer las consultas y demás para actualizar los valores de las variables.

EDIT:

La consulta:
Código PHP:
SELECT `valueFROM `mapregWHERE `varname` = "$top1pvp"
Así tantos queries como sean necesarios pero sin que salga resource ID XD
Gracias...

Última edición por rokimoki; 04/11/2009 a las 08:48
  #13 (permalink)  
Antiguo 04/11/2009, 09:15
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Ayuda query SQL

Mira, rokimoki, conforme encontré en los ejemplos de uso de MySQL con C++ en el manual de referencia (21.5.5.3. MySQL Connector/C++ Fetching results), no existe ningún impedimento para hacer un proceso iterativo que lea uno a uno los registros (que en definitiva son estructuras en memoria), y te permita poner en variables que son fijas, según me dices, los valores obtenidos de una tabla como la que yo sugiero.

¿El problema es, en ese caso, que quieres tratar de no modificar lo que ya tienes?

Mi sugerencia sería que lo hicieras, porque en el futuro posiblemente debas hacerlo y hacer las cosas bien desde el inicio y hacerlas mal, lleva el mismo tiempo.
Y corregirlas después es una tragedia...

Lo que yo veo es que el modelo de tabla que tienes no es funcional ni práctico para lo que intentas hacer.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #14 (permalink)  
Antiguo 04/11/2009, 10:12
 
Fecha de Ingreso: octubre-2008
Mensajes: 46
Antigüedad: 15 años, 7 meses
Puntos: 0
Respuesta: Ayuda query SQL

Ya si yo hago las cosas bien, pero esto que estoy haciendo va totalmente fuera de la ideología del programa y como tengo algunas ideas quería hacer esto que te comento.

El futuro ya está hecho, es decir, el programa está hecho, y el equipo posiblemente nos pongamos a trabajar en mejorar el programa y enfocar datos al SQL para el PHP, es decir como dices tú, BIEN, pero de momento lo que tengo es eso y quiero hacer las consultas.

Código PHP:
$top1 mysql_query("SELECT `value` FROM `mapreg` WHERE `varname` = '"$top1pvp"'");
$top1nombre mysql_query("SELECT `value` FROM `mapreg` WHERE `varname` = '"$top1pvp$"'"); 
??
  #15 (permalink)  
Antiguo 04/11/2009, 10:25
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Ayuda query SQL

OK.

Volviendo al Post Nº 8, entonces, la única solución que yo le veo es recorrer la estructura obtenida por programación, porque no hay forma en que el SQL te devuelva las variables con su valor, ya que las mismas, desde el lado de MySQL no existen.

Lo máximo que hará MySQL con C++ es entregar una estructura de datos en memoria que tu puedes recorrer para cargar los datos donde quieras, pero las variables que almacenaste te las devolverá como cadenas de caracteres.

La cosa es que MySQL (y cualquier DBMS) recibe estructuras de datos y devuelve estructura de datos. No puedes interactuar de uno a otro sino es a través de conectores, y estos manejan estructuras de datos. No variables compartidas.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #16 (permalink)  
Antiguo 04/11/2009, 10:56
 
Fecha de Ingreso: octubre-2008
Mensajes: 46
Antigüedad: 15 años, 7 meses
Puntos: 0
Respuesta: Ayuda query SQL

Sí pero la web no la hago en C++ y lo que yo quiero hacer con SQL se puede hacer con PHP porque de hecho tengo algo parecido hecho ya lo que pasa que no lo hice yo y la persona que lo hizo no va a estar más aquí, y yo no soy el especialista en SQL pero esto lo quiero hacer para mi no para el proyecto, por eso necesito ayuda.

Expuesto de otra manera, de la tabla quiero cojer un dato de la columna `value` sabiendo que la columna `varname` existe $top1pvp como ristra de caracteres.
  #17 (permalink)  
Antiguo 04/11/2009, 12:31
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Ayuda query SQL

Cita:
Expuesto de otra manera, de la tabla quiero cojer un dato de la columna `value` sabiendo que la columna `varname` existe $top1pvp como ristra de caracteres.
Es el mismo SELECT que ya usabas:
Código sql:
Ver original
  1. SELECT `value`
  2. FROM `mapreg`
  3. WHERE `varname` = '$top1pvp';
El problema que tienes es que vas a tener que ejecutar esto tantas veces como variables quieras recuperar.
Ahora bien, si lo que quieres es omitir la primera variable del conjunto, concentrate en la longitud de su nombre:
Código sql:
Ver original
  1. SELECT `varname`, `value`
  2. FROM `mapreg`
  3. WHERE LENGHT(`varname`)> 5;
Eso te devolverá sólo las que recuadraste en rojo.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #18 (permalink)  
Antiguo 04/11/2009, 12:58
 
Fecha de Ingreso: octubre-2008
Mensajes: 46
Antigüedad: 15 años, 7 meses
Puntos: 0
Respuesta: Ayuda query SQL

Código PHP:
$top1 mysql_query(SELECT `valueFROM `mapregWHERE `varname` = '$top1pvp'); 
Me da el error: Parse error: syntax error, unexpected '`' in /home/skyteam/www/regacc/server/prueba.php on line 13

Y si lo quito no me da error.

Gracias por tu ayuda, y por todo.
  #19 (permalink)  
Antiguo 04/11/2009, 13:04
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Ayuda query SQL

No estás creando bien el string...
Código PHP:
Ver original
  1. $top1 = mysql_query("SELECT `value` FROM `mapreg` WHERE `varname` = '$top1pvp'");
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #20 (permalink)  
Antiguo 04/11/2009, 13:23
 
Fecha de Ingreso: octubre-2008
Mensajes: 46
Antigüedad: 15 años, 7 meses
Puntos: 0
Respuesta: Ayuda query SQL

Cierto pero ese no era el problema, el problema lo causaba el resource ID, y que tengo que usar el mysql_fetchrow pero claro, me sale el campo vacío.
  #21 (permalink)  
Antiguo 04/11/2009, 13:32
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Ayuda query SQL

Si estás seguro de que hay datos que coincidan en el WHERE, y el string de la consulta está bien, te diría que lo pruebes con el phpMyAdmin.
Si funciona bien, entonces puede que hay aun problema a nivel de PHP. Postea la pregunta en el Foro de PHP.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #22 (permalink)  
Antiguo 04/11/2009, 13:40
 
Fecha de Ingreso: octubre-2008
Mensajes: 46
Antigüedad: 15 años, 7 meses
Puntos: 0
Respuesta: Ayuda query SQL

Gracias ^^
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 09:28.