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

ORDER BY en varias tablas

Estas en el tema de ORDER BY en varias tablas en el foro de Bases de Datos General en Foros del Web. Hola a todos. Quiero seleccionar varias tablas, y en base a ello, ordenar en orden "de mayor a menor" usando el campo hits. Trate de ...
  #1 (permalink)  
Antiguo 19/08/2004, 21:09
Avatar de drcyber  
Fecha de Ingreso: julio-2002
Mensajes: 826
Antigüedad: 22 años, 4 meses
Puntos: 2
ORDER BY en varias tablas

Hola a todos.

Quiero seleccionar varias tablas, y en base a ello, ordenar en orden "de mayor a menor" usando el campo hits.

Trate de hacer algo asi:

$ssql = "SELECT id,title,hits FROM general,multimedia,opensource ORDER by hits DESC LIMIT 0,15";

Pero... eso no funciona. ¿Cómo haría para hacer lo que deseo?... A continuación las estructuras de TODAS mis tablas:

CREATE TABLE general (
id int(4) NOT NULL auto_increment,
title varchar(255) NOT NULL default '',
content text NOT NULL,
posted date NOT NULL default '0000-00-00',
image varchar(60) NOT NULL default '',
hits int(5) NOT NULL default '0',
author varchar(60) NOT NULL default '',
PRIMARY KEY (id)
) TYPE=MyISAM;

Tanto general como multimedia como opensource tienen la misma estructura.

Un saludo, gracias de antemano!
__________________
Dr. Cyber
Ingeniarte.com
(soy el mismo Takitei)
  #2 (permalink)  
Antiguo 20/08/2004, 00:11
 
Fecha de Ingreso: julio-2004
Ubicación: Capital Federal, Argentina
Mensajes: 283
Antigüedad: 20 años, 4 meses
Puntos: 1
que significa "no funciona"
tira error o no hace lo que vos queres?
  #3 (permalink)  
Antiguo 20/08/2004, 04:16
Avatar de Vice  
Fecha de Ingreso: agosto-2003
Mensajes: 613
Antigüedad: 21 años, 3 meses
Puntos: 2
Esa select que montas no creo que te sirva de gran cosa, pues te da el producto cartesiano de tres tablas. Por otro lado, al ser las tres tablas con la misma estructura te tiene que dar un error por ambigüedad de los campos (tienes tres que se llaman igual, ¿cual muestras en la select?.
Si las tres son iguales ¿por qué no haces una sola y añades un campo "tipo char(1)" (general, multimedia, opensource)?. Pienso que te puede ser más útil para hacer las consultas, sobre todo si quieres consultarlo todo junto. Bueno, esto tienes que valorarlo tu mismo, sólo es una sugerencia a priori sin conocer todo el sistema.
Si no quieres unirlas en una única tabla y quieres obtener los datos de las tres tablas ordenados por hits, sólo te cabe la posibilidad de una "union"
Código:
SELECT id,title,hits FROM general
union all
SELECT id,title,hits FROM multimedia
unio all
SELECT id,title,hits FROM opensource 
union all
ORDER by hits
Problema: ¿vas a poder distinguir de alguna manera (por el id, title) de que tabla es cada fila? (en caso de que te interes puedes poner una constante en cada select para distinguir cada una).
Un saludo.
  #4 (permalink)  
Antiguo 20/08/2004, 06:49
Avatar de drcyber  
Fecha de Ingreso: julio-2002
Mensajes: 826
Antigüedad: 22 años, 4 meses
Puntos: 2
Lo que trato de hacer es un sistema de noticias. Es un sitio web que solo tratará de noticias, por lo tanto, decidí almacenar las noticias en distintas tablas por categorías. Si almaceno todas las noticias en una misma tabla, llegará un momento en el que tendré una tabla con demasiados registros para manejar y dificiles de identificar. Por eso preferí separarlos por tablas.

Resulta, que la única consulta SQL que requiere "un poquito de cada una" es esa. Esa consulta la quiero para ordenar las últimas 15 noticias más leidas usando el campo "hits". Luego, pienso hacer un link a la noticia usando el campo "id" y "title". Aca va la porción de code:

Código PHP:
        <?php 
        $ssql 
"SELECT id,title,hits FROM general,multimedia,opensource ORDER by hits DESC LIMIT 0,15";
        
$rs mysql_query($ssql);
        while(
$row=mysql_fetch_array($rs)) { ?>
          <img src="images/arrow.gif" width="10" height="11"> <a href="?show=<?php echo $row['id'?>"><?php echo $row['title'?></a><br> <?php
        
}
        
mysql_free_result($rs);
        
?>
Creo que ahora quedó más claro mi problema. ;)... ¿cuál sería la mejor alternativa?
__________________
Dr. Cyber
Ingeniarte.com
(soy el mismo Takitei)
  #5 (permalink)  
Antiguo 20/08/2004, 07:37
Avatar de Vice  
Fecha de Ingreso: agosto-2003
Mensajes: 613
Antigüedad: 21 años, 3 meses
Puntos: 2
Pues con lo que dices, la mejor opción es la de una tabla única con un campo que indica la categoría. Piensa que si sigues aumentando las categorías, tendrás que seguir añadiendo tablas. ¿Muchos registros?, con un buen índice se solucionan los problemas. ¿Difíciles de identificar?, no, sólo hay que ponerles el campo de tipo de categoría y los tendrás igualmente identificados que en tres tablas y si quieres más categorías sólo hay que considerar un nuevo valor para el campo de tipo de categoría.
Si de todas formas sigues manteniendo las tres tablas, la solución es lo que te puse antes: las tres selects con la "union" entre ellas.

Un saludo.
  #6 (permalink)  
Antiguo 20/08/2004, 07:39
Avatar de drcyber  
Fecha de Ingreso: julio-2002
Mensajes: 826
Antigüedad: 22 años, 4 meses
Puntos: 2
Bueno amigo, te obedezco entonces. Tu eres más experto que yo en bases de datos.
Un saludo, gracias!
__________________
Dr. Cyber
Ingeniarte.com
(soy el mismo Takitei)
  #7 (permalink)  
Antiguo 20/08/2004, 07:43
Avatar de drcyber  
Fecha de Ingreso: julio-2002
Mensajes: 826
Antigüedad: 22 años, 4 meses
Puntos: 2
Ahora... me quedé con las ganas de aprender a unir las tablas. Si uso el UNION, ¿cómo identificaría el campo "title" e "id" para cada tabla?
__________________
Dr. Cyber
Ingeniarte.com
(soy el mismo Takitei)
  #8 (permalink)  
Antiguo 20/08/2004, 08:42
Avatar de Vice  
Fecha de Ingreso: agosto-2003
Mensajes: 613
Antigüedad: 21 años, 3 meses
Puntos: 2
No tienes forma de hacerlo de manera directa salvo que los id de las tablas contengan algo que las diferencien.
Sino, la forma es como te dije antes: una constante en cada select para saber de que tabla se trata cada fila:
Código:
SELECT "G",id,title,hits FROM general
union all
SELECT "M",id,title,hits FROM multimedia
unio all
SELECT "O",id,title,hits FROM opensource 
union all
ORDER by hits
Un saludo.

PD: no es cuestión de obedecer, te doy un consejo, si quieres lo usas sino ahí queda :D.
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 23:06.