Foros del Web » Programando para Internet » PHP »

Cómo concatenar dos sentencias sql parecidas

Estas en el tema de Cómo concatenar dos sentencias sql parecidas en el foro de PHP en Foros del Web. Me gustaría que me mostrara los resultados de dos sentencias sql simultáneas. Es decir. Tengo esto: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código PHP: Ver original $sql = "SELECT ...
  #1 (permalink)  
Antiguo 14/01/2010, 08:12
Avatar de CHuLoSoY  
Fecha de Ingreso: febrero-2002
Ubicación: Ribeira (Galicia)
Mensajes: 1.900
Antigüedad: 22 años, 9 meses
Puntos: 29
Cómo concatenar dos sentencias sql parecidas

Me gustaría que me mostrara los resultados de dos sentencias sql simultáneas. Es decir. Tengo esto:

Código PHP:
Ver original
  1. $sql="SELECT * , MATCH(asunto, mensaje) AGAINST ('$cadenaBusqueda') as Score
  2. FROM gap_foro_mensajes
  3. WHERE MATCH(asunto, mensaje) AGAINST ('$cadenaBusqueda') ORDER BY Score DESC";
Y necesito que además ejecutara esto:
Código PHP:
Ver original
  1. $sql="SELECT * , MATCH(asunto, mensaje) AGAINST ('$cadenaBusqueda') as Score
  2. FROM gap_foro_respuestas
  3. WHERE MATCH(asunto, mensaje) AGAINST ('$cadenaBusqueda') ORDER BY Score DESC";

que es lo mismo en distintas tablas. He intentado esto:
Código PHP:
Ver original
  1. $sql="SELECT * , MATCH(asunto, mensaje) AGAINST ('$cadenaBusqueda') as Score
  2. FROM gap_foro_mensajes, gap_foro_respuestas
  3. WHERE MATCH(asunto, mensaje) AGAINST ('$cadenaBusqueda') ORDER BY Score DESC";
Pero a pesar de que los campos coinciden no funciona. Sólo funciona por separado.

Habría forma de hacer consultas en dos tablas?

Saludos.
__________________
ESQUIO Dominios y Hosting
Las mejores características con los mejores precios.

Última edición por CHuLoSoY; 14/01/2010 a las 08:22
  #2 (permalink)  
Antiguo 14/01/2010, 08:23
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años, 7 meses
Puntos: 839
Respuesta: Cómo concatenar dos sentencias sql parecidas

Si lo que quieres es unir el resultado de ambas consultas puedes usar UNION:
http://dev.mysql.com/doc/refman/5.0/es/union.html
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #3 (permalink)  
Antiguo 14/01/2010, 08:27
Avatar de CHuLoSoY  
Fecha de Ingreso: febrero-2002
Ubicación: Ribeira (Galicia)
Mensajes: 1.900
Antigüedad: 22 años, 9 meses
Puntos: 29
Perfecto, muchas gracias!

No del todo.... no me funciona:

Código PHP:
Ver original
  1. $sql="(SELECT * , MATCH(asunto, mensaje) AGAINST ('$cadenaBusqueda') as Score FROM gap_foro_mensajes WHERE MATCH(asunto, mensaje) AGAINST ('$cadenaBusqueda') ORDER BY Score DESC)
  2. UNION
  3. (SELECT * , MATCH(asunto, mensaje) AGAINST ('$cadenaBusqueda') as Score FROM gap_foro_respuestas WHERE MATCH(asunto, mensaje) AGAINST ('$cadenaBusqueda') ORDER BY Score DESC);";
ni
Código PHP:
Ver original
  1. $sql="SELECT * , MATCH(asunto, mensaje) AGAINST ('$cadenaBusqueda') as Score FROM gap_foro_mensajes WHERE MATCH(asunto, mensaje) AGAINST ('$cadenaBusqueda') ORDER BY Score DESC
  2. UNION
  3. SELECT * , MATCH(asunto, mensaje) AGAINST ('$cadenaBusqueda') as Score FROM gap_foro_respuestas WHERE MATCH(asunto, mensaje) AGAINST ('$cadenaBusqueda') ORDER BY Score DESC;";
ni
Código PHP:
Ver original
  1. $sql="(SELECT * , MATCH(asunto, mensaje) AGAINST ('$cadenaBusqueda') as Score FROM gap_foro_mensajes WHERE MATCH(asunto, mensaje) AGAINST ('$cadenaBusqueda') ORDER BY Score DESC)
  2. UNION
  3. (SELECT * , MATCH(asunto, mensaje) AGAINST ('$cadenaBusqueda') as Score FROM gap_foro_respuestas WHERE MATCH(asunto, mensaje) AGAINST ('$cadenaBusqueda') ORDER BY Score DESC)";

¿Qué puedo hacer?
__________________
ESQUIO Dominios y Hosting
Las mejores características con los mejores precios.

Última edición por GatorV; 14/01/2010 a las 15:11
  #4 (permalink)  
Antiguo 14/01/2010, 08:39
Avatar de FNX_NET  
Fecha de Ingreso: marzo-2004
Ubicación: EN EL INFIERNO.....
Mensajes: 1.707
Antigüedad: 20 años, 7 meses
Puntos: 7
Respuesta: Cómo concatenar dos sentencias sql parecidas

mira este ejemplo

SELECT *
FROM ( SELECT *
, MATCH(name, description)
AGAINST ('sampletext') AS score
FROM table1
WHERE MATCH(name, description)
AGAINST('sampletext') > 0
UNION ALL
SELECT *
, MATCH(name, description)
AGAINST ('sampletext') AS score
FROM table2
WHERE MATCH(name, description)
AGAINST('sampletext') > 0
) AS combined_results
ORDER
BY score
__________________
:-D "Que se libere del cielo confinado; que mi cuerpo sea la espada de hielo negro que nos lleve al abismo; que ningún poder pueda detenernos...Destructora de las almas de los dioses!!!":adios:


:pirata:
  #5 (permalink)  
Antiguo 14/01/2010, 08:48
Avatar de CHuLoSoY  
Fecha de Ingreso: febrero-2002
Ubicación: Ribeira (Galicia)
Mensajes: 1.900
Antigüedad: 22 años, 9 meses
Puntos: 29
He pintado esto y nada:

Código PHP:
Ver original
  1. $sql="SELECT * FROM(
  2. SELECT * , MATCH(asunto, mensaje) AGAINST ('$cadenaBusqueda') as Score FROM gap_foro_mensajes WHERE MATCH(asunto, mensaje) AGAINST ('$cadenaBusqueda')
  3. UNION ALL
  4. SELECT * , MATCH(asunto, mensaje) AGAINST ('$cadenaBusqueda') as Score FROM gap_foro_respuestas WHERE MATCH(asunto, mensaje) AGAINST ('$cadenaBusqueda')
  5. ) AS resultadosCombinados ORDER BY Score DESC";

Simplemente no ofrece resultados, ni siquiera funciona mysql_num_rows

Destacar que corté las líneas para que se vea bien aquí, pero va todo seguido.

Bien, para que te hagas una idea, tengo el código siguiente (lo pongo entero):

Código PHP:
Ver original
  1. include("datos_usuario_db.php");
  2.  
  3.  
  4. $cadenaBusqueda=$_POST['cadenaBusqueda'];
  5. $dondeBuscar=$_POST['dondeBuscar'];
  6. $resultados[0]=array(); //para mensajes foro
  7. $resultados[1]=array(); //para respuestas foro
  8.  
  9. if($dondeBuscar=="todos") {
  10.  
  11.         $conexion=mysql_connect($dbserver,$dbuser,$dbpass);
  12.         mysql_select_db($db,$conexion);
  13.  
  14.         $sql="SELECT * , MATCH(asunto, mensaje) AGAINST ('$cadenaBusqueda') as Score FROM gap_foro_mensajes WHERE MATCH(asunto, mensaje) AGAINST ('$cadenaBusqueda')  ORDER BY Score DESC";
  15.         $result=mysql_query($sql,$conexion);
  16. $cuantosMsgForo=mysql_num_rows($result);
  17. $variable=0;
  18.         while($row=@mysql_fetch_array($result)) {
  19.  
  20.             if($bandera==0) { $colorFondo="#FFE7D7"; $bandera=1; } else { $colorFondo="#F2D2B7"; $bandera=0; }
  21.             $resultados[0][$variable]=array();
  22.             $resultados[0][$variable]['asunto']=$row['asunto'];
  23.             $resultados[0][$variable]['id']=$row['id'];
  24.             $resultados[0][$variable]['user']=$row['user'];
  25.             $resultados[0][$variable]['fondo']=$colorFondo;
  26.             $resultados[0][$variable]['fecha']=$row['fecha'];
  27.             $resultados[0][$variable]['puntuacion']=$row['Score'];
  28.  
  29.             $cadBus=explode(" ",$cadenaBusqueda);
  30.                  $func = preg_match("/".$cadBus[0]."{1}.+/is",$row['mensaje'],$matches);
  31.            
  32.             $resultados[0][$variable]['trozo']=$matches[0];
  33.             $resultados[0][$variable]['trozo']=str_replace("'","'",$resultados[0][$variable]['trozo']);
  34.             $resultados[0][$variable]['trozo']=str_replace('"',""",$resultados[0][$variable]['trozo']);
  35.             $resultados[0][$variable]['trozo']=str_replace('<',"&lt;",$resultados[0][$variable]['trozo']);
  36.             $resultados[0][$variable]['trozo']=str_replace('>',"&gt;",$resultados[0][$variable]['trozo']);
  37.             $resultados[0][$variable]['trozo']=substr($resultados[0][$variable]['trozo'],0,70);
  38.             $variable++;
  39.         }
  40.         @mysql_free_result($result);
  41.         mysql_close($conexion);
  42.  
  43. $totalVariable=$variable;
  44.  
  45.  
  46.  
  47.  
  48.         $conexion=mysql_connect($dbserver,$dbuser,$dbpass);
  49.         mysql_select_db($db,$conexion);
  50.  
  51.         $sql="SELECT * , MATCH(asunto, mensaje) AGAINST ('$cadenaBusqueda') as Score FROM gap_foro_respuestas WHERE MATCH(asunto, mensaje) AGAINST ('$cadenaBusqueda')  ORDER BY Score DESC";
  52.         $result=mysql_query($sql,$conexion);
  53. $cuantasRespForo=mysql_num_rows($result);$variable=0;
  54. $cuantosTtoales=$cuantosMsgForo+$cuantasRespForo;
  55.  
  56.  
  57.         while($row=@mysql_fetch_array($result)) {
  58.  
  59.             $cadBus=explode(" ",$cadenaBusqueda);
  60.             if($bandera==0) { $colorFondo="#FFE7D7"; $bandera=1; } else { $colorFondo="#F2D2B7"; $bandera=0; }
  61.             $resultados[1][$variable]=array();
  62.             $resultados[1][$variable]['asunto']=$row['asunto'];
  63.             $resultados[1][$variable]['id']=$row['id'];
  64.             $resultados[1][$variable]['user']=$row['user'];
  65.             $resultados[1][$variable]['fecha']=$row['fecha'];
  66.             $resultados[1][$variable]['fondo']=$colorFondo;
  67.             $resultados[1][$variable]['puntuacion']=$row['Score'];
  68.                  $func = preg_match("/".$cadBus[0]."{1}.+/is",$row['mensaje'],$matches);
  69.            
  70.             $resultados[1][$variable]['trozo']=$matches[0];
  71.             $resultados[1][$variable]['trozo']=str_replace("'","&apos;",$resultados[1][$variable]['trozo']);
  72.             $resultados[1][$variable]['trozo']=str_replace('"',"&quot;",$resultados[1][$variable]['trozo']);
  73.             $resultados[1][$variable]['trozo']=str_replace('<',"&lt;",$resultados[1][$variable]['trozo']);
  74.             $resultados[1][$variable]['trozo']=str_replace('>',"&gt;",$resultados[1][$variable]['trozo']);
  75.             $resultados[1][$variable]['trozo']=substr($resultados[1][$variable]['trozo'],0,70);
  76.            
  77.            
  78.             $variable++;
  79.    
  80.         }
  81.         @mysql_free_result($result);
  82.         mysql_close($conexion);
  83.  
  84.  
  85. $contenidoAMeter="<tr><td width=100% colspan=2 style='font-weight:bold;background-color:#565656;color:white;-moz-border-radius:8px 8px 0px 0px;'>".$cuantosTtoales." resultados en el foro</td></tr>";
  86.  
  87. $totalVariable2=$variable;
  88. $j=0;
  89. for($i=0;$i<=$totalVariable2;$i++) {
  90.  
  91. $puntuacion=number_format($resultados[$j][$i]['puntuacion'],2,'.',',');
  92.  
  93.  
  94.  
  95.     $contenidoAMeter.="<tr style=background-color:".$resultados[$j][$i]['fondo'].";><td width=75%><a href=javascript:; onclick=\\\"javascript:leerMsgForoDesdeIndex(".$resultados[$j][$i]['id'].",'1&marca=".$cadenaBusqueda."');\\\"><strong>".$resultados[$j][$i]['asunto']."</strong></a></td><td width=25% align=center>".$resultados[$j][$i]['user']."</td></tr><tr style=background-color:".$resultados[$j][$i]['fondo'].";><td width=100% style='border-color:#565656;border-width:0px;border-bottom-width:0px;border-style:solid;color:666666;'>...".$resultados[$j][$i]['trozo']."...</td><td width=25% align=right>".$puntuacion."</td></tr>";
  96.  
  97.     if($i==$totalVariable-1) { $j=1; }
  98.  
  99. }
  100.  
  101. }

Es decir, que muestro los mensajes y las respuestas todas seguidas, y respuestas al mismo mensaje se pueden repetir muuuuuucho. Lo que pretendo con la concatenación de tablas en la misma sentencia sql es comparar para ahorrarme esos resultados.

Si no es como yo pienso, ¿alguna idea de cómo se puede hacer?
__________________
ESQUIO Dominios y Hosting
Las mejores características con los mejores precios.

Última edición por GatorV; 14/01/2010 a las 15:10

Etiquetas: concatenar, dos, sentencias, sql
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 12:52.