13 messaggi dal 14 giugno 2005
Un saluto a tutta la community ! :)

Ho un "problemino" abbastanza particolare. Vi spiego cosa vorrei fare:
Ho un capo ricerca strutturato cosi:

PAROLA CHIAVE DELLA RICERCA | CATEGORIA | PREZZO MIN | PREZZO MAX

Supponiamo che una persona sceglie la CATEGORIA auto.

Il mio database MySQL e strutturato in questo modo (non chiedetemi il perché| :D)
Auto_nuove
Auto_usate
Accessori_auto
Antifurti_auto

Quando la persona vuole cercare nella categoria AUTO il script deve eseguire una ricerca in tutte queste quattro tabelle (che come struttura sono identiche).
Qui entra in gioco la funzione UNION.

Io però non ce l’ho solo la categoria auto. Avrò anche Immobili, Lavoro, ecc.
Quello che potrei usare sarebbe una Select Case.

Il mio codice attuale e il seguente:
Questo codice fa la ricerca IN UNA SOLA TABELLA e senza nessun select case.

 
server.ScriptTimeout = 300 '5 minuti
'Recupero le variabili per paginare
page = Cint(request.querystring("page"))
if page = 0 then page = 1
'Assegno il nome del database
database = "database"
'dichiaro le variabili
dim RicercaTesto, RicercaCategoria, PrezzoMin, PrezzoMax, voci
'recupero campi dal form di ricerca e gli converto nelle variabili
RicercaTesto = Request.form("testo_ricerca")
RicercaCategoria = Request.form("categoria")
PrezzoMin = Request.form("prezzo_min")
PrezzoMax = Request.form("prezzo_max")
voci = split(RicercaTesto)
'se l'utente ha javascript disabilitato e riesce a fare la ricerca, allora imposto
'PrezzoMin a 0 e PrezzoMax a 999999
If Len(PrezzoMin) = 0 or Not IsNumeric(PrezzoMin) then
PrezzoMin = 0
End If
If Len(PrezzoMax) = 0 or Not IsNumeric(PrezzoMax) then
PrezzoMax = 999999
End If

call dbConnect(objConn, database)


'Record per pagina
pageSize = 10
'Numero di Pagine visualizzate nei link
Numerazione_Max = 7
'Primo record di ogni pagina
inizio = (page - 1) * pageSize
'Pagine complessive per effetto della paginazione
pagine_totali = tot_record / pageSize
'Arrotondamento in caso di resto della divisione precedente
if pagine_totali - CInt(pagine_totali) > 0 then
pagine_totali = CInt(pagine_totali + 1)
else
pagine_totali = CInt(pagine_totali)
end If

strSQL = "SELECT * FROM "&RicercaCategoria&" WHERE"
for i = 0 to uBound(voci)
if i=0 then strSQL=strSQL & "("
strSQL = strSQL & " titolo LIKE '%" & voci(i) & "%' OR descrizione LIKE '%" & voci(i) & "%'"
if i < uBound(voci) then strSQL = strSQL & " OR"
if i=ubound(voci) then strSQL=strSQL & ")"
next

strSQL=strSQL & " AND (prezzo >= "&PrezzoMin&" AND prezzo <= "&PrezzoMax&")  LIMIT "& inizio &", "& pageSize

Set objRS = server.CreateObject("ADODB.Recordset")
objRS.Open strSQL, objConn
'Totale dei record
strSQL2 = "SELECT COUNT(*) FROM " & RicercaCategoria & ""
Set objRS2 = objConn.Execute(strSQL2)
tot_record = objRS2(0)
set objRS2 = nothing



Come posso adattare questo codice ad una select case nella quale ci sono istruzioni sql per eseguire la ricerca nelle diverse tabelle usando UNION ?
(ps ricordo che il database e MySQL)

Vi ringrazio veramente di cuore per aver letto tutto!
Spero che qualcuno di voi mi possa aiutare!

Vi ringrazio ancora una volta.
Modificato da Cesar il 28 settembre 2005 15.19 -
823 messaggi dal 05 agosto 2002
Allora, alcuni aiutini generali:
1. posta la domanda nel forum appropriato, quello riguardante SQLServer e MySQL

2. dobbiamo invece chiedere perchè il tuo db è disegnato cosi, ossia male, e la cosa complica non poco la vita, pensa seriamente a ristrutturarlo invece di complicarlo con nuove categorie

3. se almeno fossi su postgresql o mysql 5 potresti provare a "unificare" le tabelle con una vista, ma non credo

4. auguri ...

Stick to your guns.
Formazione su MySQL o Firebird? Contattami!
13 messaggi dal 14 giugno 2005
pabloj ha scritto:
Allora, alcuni aiutini generali:
1. posta la domanda nel forum appropriato, quello riguardante SQLServer e MySQL


ops... :(


2. dobbiamo invece chiedere perchè il tuo db è disegnato cosi, ossia male, e la cosa complica non poco la vita, pensa seriamente a ristrutturarlo invece di complicarlo con nuove categorie


Purtroppo ogni tabella arriverà ad avere circa 1500 records. così facendo la ricerca avverà più velocemente !


3. se almeno fossi su postgresql o mysql 5 potresti provare a "unificare" le tabelle con una vista, ma non credo


ma usando UNION ?

sSQL = ""
SELECT CASE iMode
   CASE 1
      sSQL = sSQL & " SELECT nome, cognome FROM Fornitori"
      sSQL = sSQL & " UNION"
      sSQL = sSQL & " SELECT nome, cognome FROM Clienti"
   CASE 2
      sSQL = sSQL & " SELECT nome, cognome FROM Amici"
      sSQL = sSQL & " UNION"
      sSQL = sSQL & " SELECT nome, cognome FROM Parenti"
   CASE Else
      ' 
END SELECT





4. auguri ...


Grazie!

Modificato da Cesar il 28 settembre 2005 16.24 -
823 messaggi dal 05 agosto 2002
Ogni tabella avrà SOLO 1500 record??? E tu pensi di aver aumentato la velocità moltiplicando le tabelle??? Per favore, rimetti tutto insieme, aggiungi un campo categoria (invece che una tabella per categoria) e indicizzalo.

Stick to your guns.
Formazione su MySQL o Firebird? Contattami!
13 messaggi dal 14 giugno 2005
Si.. però mi spiego meglio.
Io ce l'ho circa 350 tabelle che come minimo conteranno 1500 record ciascuna...
Modificato da Cesar il 28 settembre 2005 18.33 -
13 messaggi dal 14 giugno 2005
Per piacere aiutatemi a fare questa select case con il mio codice e con la union per unire più tabelle !

13 messaggi dal 14 giugno 2005
ho risolto!

però ora mi esce questo errore:
Microsoft VBScript runtime error '800a000d'

Type mismatch

principalmente a cos'e dovuto ?
13 messaggi dal 14 giugno 2005
ho risolto con quel errore.

ma ora cè un problema un pò più grave :(

non mi fa più vedere il numero delle pagine e i link "Precedente", "Successiva".

permetto che i records ci sono nel database.

questo e il codice completo della ricerca:

   <%
server.ScriptTimeout = 300 '5 minuti
'Recupero le variabili per paginare
page = Cint(request.querystring("page"))
if page = 0 then page = 1
'Assegno il nome del database
database = "nome_database"
'dichiaro le variabili
dim RicercaTesto, RicercaCategoria, PrezzoMin, PrezzoMax, voci
'recupero campi dal form di ricerca e gli converto nelle variabili
RicercaTesto = Request.form("testo_ricerca")
RicercaCategoria = Request.form("categoria")
PrezzoMin = Request.form("prezzo_min")
PrezzoMax = Request.form("prezzo_max")
voci = split(RicercaTesto)
'se l'utente ha javascript disabilitato e riesce a fare la ricerca, allora imposto
'PrezzoMin a 0 e PrezzoMax a 999999
If Len(PrezzoMin) = 0 or Not IsNumeric(PrezzoMin) then
PrezzoMin = 0
End If
If Len(PrezzoMax) = 0 or Not IsNumeric(PrezzoMax) then
PrezzoMax = 999999
End If

call dbConnect(objConn, database)


'Record per pagina
pageSize = 10
'Numero di Pagine visualizzate nei link
Numerazione_Max = 7
'Primo record di ogni pagina
inizio = (page - 1) * pageSize
'Pagine complessive per effetto della paginazione
pagine_totali = tot_record / pageSize
'Arrotondamento in caso di resto della divisione precedente
if pagine_totali - CInt(pagine_totali) > 0 then
pagine_totali = CInt(pagine_totali + 1)
else
pagine_totali = CInt(pagine_totali)
end If


Select Case RicercaCategoria
Case "Auto"

 ''''''''''''''''''''''''''''''''''''''''
''
'qui la prima select che la devo mettere
 ''''''''''''''''''''''''''''''''''''''''
''

 ''''''''''''''''''''''''''''''''''''''''
''
Case "Prova"
strSQL = "SELECT * FROM prova1 WHERE"
for i = 0 to uBound(voci)
if i=0 then strSQL=strSQL & "("
strSQL = strSQL & " titolo LIKE '%" & voci(i) & "%' OR descrizione LIKE '%" & voci(i) & "%'"
if i < uBound(voci) then strSQL = strSQL & " OR"
if i=ubound(voci) then strSQL=strSQL & ")"
next

strSQL = strSQL & " AND (prezzo >= "&PrezzoMin&" AND prezzo <= "&PrezzoMax&")  LIMIT "& inizio &", "& pageSize 

strSQL = strSQL & " UNION"

strSQL = strSQL & " SELECT * FROM prova2 WHERE"
for i = 0 to uBound(voci)
if i=0 then strSQL=strSQL & "("
strSQL = strSQL & " titolo LIKE '%" & voci(i) & "%' OR descrizione LIKE '%" & voci(i) & "%'"
if i < uBound(voci) then strSQL = strSQL & " OR"
if i=ubound(voci) then strSQL=strSQL & ")"
next

strSQL=strSQL & " AND (prezzo >= "&PrezzoMin&" AND prezzo <= "&PrezzoMax&")  LIMIT "& inizio &", "& pageSize

Set objRS = server.CreateObject("ADODB.Recordset")
objRS.Open strSQL, objConn
'Totale dei record
strSQL2 = " SELECT COUNT(*) FROM prova1"
strSQL2 = strSQL2 & " UNION"
strSQL2 = strSQL2 & " SELECT COUNT(*) FROM prova2"
Set objRS2 = objConn.Execute(strSQL2)
tot_record = objRS2(0)
set objRS2 = nothing

End Select



if not objRS.EOF then
Response.Write ("<table width=""600"" border=""0"" align=""center"" cellpadding=""0"" cellspacing=""0"" class=""sfondo1"">")
Response.Write ("<tr>") 
Response.Write ("<td width=""71""> </td>")
Response.Write ("<td width=""368""><div align=""center""><strong>Prodotto</strong></div></td>")
Response.Write ("<td width=""71""><div align=""center""><strong>Reparto</strong></div></td>")
Response.Write ("<td width=""90""><div align=""center""><strong>Prezzo</strong></div></td>")
Response.Write ("</tr>")
Response.Write ("</table>")

do while not objRS.EOF
Response.Write ("<table width=""600"" border=""0"" align=""center"" cellpadding=""0"" cellspacing=""0"">")
Response.Write ("<tr>")
Response.Write ("<td width=""12%"" rowspan=""2""><div align=""left""><img src=http://localhost/public/prova/"& objRS("img") &" width=""65"" height=""65""></div></td>")
Response.Write ("<td width=""61%""><a href="& objRS("url") &" class=""link_pg""><strong>" & objRS("titolo") & "</strong></a></td>")
Response.Write ("<td width=""12%"" rowspan=""2""><div align=""center""><img src=http://localhost/public/reparto/"& objRS("reparto") &" width=""65"" height=""65""></div></td>")
Response.Write ("<td width=""15%"" rowspan=""2""><div align=""center""><strong>"& objRS("prezzo") &" ¤ </strong></div></td>")
Response.Write ("</tr>")
Response.Write ("<tr>")
Response.Write ("<td class=""testo_pg"">"& objRS("descrizione") &"</td>")
Response.Write ("</tr>")
Response.Write ("<tr>")
Response.Write ("<td height=""2"" colspan=""4""><img src=""../img/pixel.gif"" width=""1"" height=""1""></td>")
Response.Write ("</tr>")
Response.Write ("<tr>")
Response.Write ("<td height=""1"" colspan=""4"" class=""sfondo2""><img src=""../img/pixel.gif"" width=""1"" height=""1""></td>")
Response.Write ("</tr>")
Response.Write ("</table>")

objRS.movenext
Loop
Response.Write ("<table width=""500"" border=""0"" align=""center"" cellpadding=""0"" cellspacing=""0"">")
Response.Write ("<tr>")
Response.Write ("<td><div align=""center"">")

'Pagine precedenti
if page > 1 then
Response.write("    <a href=""auto-nuove.asp?page="& CInt(page - 1) &"""class=""link_numero_pagine"""">Pagina precedente</a>")
else
Response.Write ("")
end if

numero_pagine=5
inizio=1
if (page>numero_pagine) then inizio=page-numero_pagine
fine=pagine_totali
if (page+numero_pagine<pagine_totali) then fine=page+numero_pagine
for t=inizio to fine
if (t=page) then
Response.write("  <strong>" & CInt(t)&"</strong>")
else
Response.write("  <a href=""auto-nuove.asp?page="& CInt(t) &"""class=""link_numero_pagine"""">"&cint(t)&"</a>")
end if
next

'Pagine successive
<b>
'qui mi dice che la pagina e unica. ma non e verò perche ci sono altri records.
if CLng(tot_record) > CLng(pageSize) and CLng(pagine_totali) > CLng(page) then
Response.write("    <a href=""auto-nuove.asp?page="& CInt(page + 1) & """class=""link_numero_pagine"""">Pagina successiva</a>")
else
Response.Write ("Pagina Unica")
end if
</b>
Response.Write ("</div></td>")
Response.Write ("</tr>")
Response.Write ("</table>")
else
Response.write ("Nessun prodotto.")
end if


objRS.close
set objRS = nothing
Response.Write ("</div></td>")
Response.Write ("</tr>")
Response.Write ("</table>")
call dbDisconnect(objConn, database)
'SUB
'Apertura connessione database
sub dbConnect(objConn, database)
connectionstring = "DRIVER={MySQL ODBC 3.51 Driver};DATABASE="& database &" ;SERVER=localhost;UID=xxxxxxxx;PASSWORD=
xxxxxxxxxx"
set objConn = server.createObject("ADODB.Connection")
objConn.Open connectionstring
end sub
'Chiusura connessione database
sub dbDisconnect(objConn, database)
objConn.close
set objConn = nothing
end sub
%>


per piacere... datemi un mano perchè non so più dove sbattere la testa..

Vi ringrazio di cuore.

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.