22 messaggi dal 03 settembre 2008
Ragazzi un aiuto veloce, cerco di essere chiaro e breve al tempo stesso:
ho una tabella Auto ed una Optional, ed ho una pagina di ricerca delle auto in cui posso chiedere solo le auto che abbiano gli optional X ed Y.

Le tabelle sono così strutturate:

Auto:
----
ID
etc...

Optional
----
ID
IDAuto
etc...

La mia query è questa:

Select * from Auto INNER JOIN Optional ON Auto.ID = Optional.IDAuto WHERE Optional.ID LIKE ? AND Optional.ID LIKE ?

Uso il like perchè in assenza di filtri uso il jolly %
Il problema è che la query funziona se non ricerco optional oppure se ne cerco uno solo, se ne ricerco due o più la query mi torna vuota! Come mai?

Grazie per l'aiuto!
438 messaggi dal 04 agosto 2002
Contributi
ciao,

a parte che non ho capito perchè metti due volte nella clausola WHERE Optional.ID LIKE ?, puoi fare un esempio di query che ti torna vuota "cercando due o più optional"?

A proposito: mysql o sql server?

v
Modificato da vladimiro il 03 settembre 2008 19.22 -
22 messaggi dal 03 settembre 2008
MSSQL Server 2005.

Metto due volte il parametro perchè posso cercare, ad esempio, un auto che abbia l'autoradio ed il climatizzatore, quindi che abbia due diversi optional.

La query per intero è un mattone, provo ad allegarla...
Comunque come ho spiegato prima, se i 2 parametri sono jolly funziona tutto, se 1 parametro è definito e l'altro è jolly funziona ancora, se invece entrambi i parametri sono definiti, la select torna vuota (benchè esistano diverse auto che rispondano ai requisiti.

Ti posto la query, i parametri in questione sono gli ultimi dal @33 al @36...
Grazie per la disponibilità - e per la voglia soprattutto :P

----

SELECT tbl_ExC_Jahr_Auto.ID, tbl_ExC_Type_Marca.Nome AS Marca, tbl_ExC_Jahr_Type_Modello.Nome AS Modello,
tbl_ExC_Jahr_Type_Linea.Nome AS Linea, tbl_ExC_Jahr_Type_ColInterno.Codice AS ColInt, tbl_ExC_Jahr_Type_ColEsterno.Codice AS ColEst,
tbl_ExC_Jahr_Auto.KM, tbl_ExC_Jahr_Auto.Immatricolazione, tbl_ExC_Jahr_Auto.EUROfferta, tbl_ExC_Jahr_Auto.EURListino,
tbl_ExC_Jahr_Auto.EUROfferta * 100 / tbl_ExC_Jahr_Auto.EURListino AS Rapporto, tbl_ExC_Jahr_Auto.EURRiPePa / 100 AS RiPePa,
tbl_ExC_Jahr_Auto.EqCambio, tbl_ExC_Jahr_Auto.EqNav, tbl_ExC_Jahr_Auto.EqCerchi, tbl_ExC_Jahr_Auto.EqTetto, tbl_ExC_Jahr_Auto.EqPark,
tbl_ExC_Jahr_Auto.EqXeno, tbl_ExC_Jahr_Auto.EqSport, tbl_ExC_Jahr_Auto.EqAMG, tbl_Com_ProvinceItaliane.Sigla
FROM tbl_ExC_Jahr_Type_Modello INNER JOIN
tbl_ExC_Jahr_Auto ON tbl_ExC_Jahr_Type_Modello.ID = tbl_ExC_Jahr_Auto.IDModello INNER JOIN
tbl_ExC_Jahr_Type_Classe INNER JOIN
tbl_ExC_Type_Marca ON tbl_ExC_Jahr_Type_Classe.IDMarca = tbl_ExC_Type_Marca.ID ON
tbl_ExC_Jahr_Type_Modello.IDClasse = tbl_ExC_Jahr_Type_Classe.ID INNER JOIN
tbl_ExC_Jahr_Type_Linea ON tbl_ExC_Jahr_Auto.IDLinea = tbl_ExC_Jahr_Type_Linea.ID INNER JOIN
tbl_ExC_Jahr_Type_ColEsterno ON tbl_ExC_Jahr_Auto.IDColEsterno = tbl_ExC_Jahr_Type_ColEsterno.ID INNER JOIN
tbl_ExC_Jahr_Type_ColInterno ON tbl_ExC_Jahr_Auto.IDColInterno = tbl_ExC_Jahr_Type_ColInterno.ID INNER JOIN
tbl_ExC_Localita ON tbl_ExC_Jahr_Auto.IDLocalita = tbl_ExC_Localita.ID INNER JOIN
tbl_Com_ProvinceItaliane ON tbl_ExC_Localita.IDProv = tbl_Com_ProvinceItaliane.ID INNER JOIN
tbl_Com_RegioniItaliane ON tbl_Com_ProvinceItaliane.Ref_Regione = tbl_Com_RegioniItaliane.ID INNER JOIN
tbl_ExC_Type_Colore ON tbl_ExC_Jahr_Type_ColEsterno.IDColore = tbl_ExC_Type_Colore.ID INNER JOIN
tbl_ExC_Type_Colore AS tbl_ExC_Type_Colore_1 ON tbl_ExC_Jahr_Type_ColInterno.IDColore = tbl_ExC_Type_Colore_1.ID INNER JOIN
tbl_ExC_Type_Carrozzeria ON tbl_ExC_Jahr_Type_Modello.IDCarrozzeria = tbl_ExC_Type_Carrozzeria.ID INNER JOIN
tbl_ExC_Type_Alimentazione ON tbl_ExC_Jahr_Type_Modello.IDAlimentazione = tbl_ExC_Type_Alimentazione.ID INNER JOIN
tbl_ExC_Jahr_EquipaggiamentiAuto ON tbl_ExC_Jahr_Auto.ID = tbl_ExC_Jahr_EquipaggiamentiAuto.IDAuto INNER JOIN
tbl_ExC_Jahr_Equipaggiamenti ON tbl_ExC_Jahr_EquipaggiamentiAuto.IDEquip = tbl_ExC_Jahr_Equipaggiamenti.ID INNER JOIN
tbl_ExC_Jahr_EquipaggiamentiAuto AS tbl_ExC_Jahr_EquipaggiamentiAuto_1 ON
tbl_ExC_Jahr_Auto.ID = tbl_ExC_Jahr_EquipaggiamentiAuto_1.IDAuto INNER JOIN
tbl_ExC_Jahr_EquipaggiamentiAuto AS tbl_ExC_Jahr_EquipaggiamentiAuto_2 ON
tbl_ExC_Jahr_Auto.ID = tbl_ExC_Jahr_EquipaggiamentiAuto_2.IDAuto INNER JOIN
tbl_ExC_Jahr_EquipaggiamentiAuto AS tbl_ExC_Jahr_EquipaggiamentiAuto_3 ON
tbl_ExC_Jahr_Auto.ID = tbl_ExC_Jahr_EquipaggiamentiAuto_3.IDAuto INNER JOIN
tbl_ExC_Jahr_Equipaggiamenti AS tbl_ExC_Jahr_Equipaggiamenti_1 ON
tbl_ExC_Jahr_EquipaggiamentiAuto_1.IDEquip = tbl_ExC_Jahr_Equipaggiamenti_1.ID INNER JOIN
tbl_ExC_Jahr_Equipaggiamenti AS tbl_ExC_Jahr_Equipaggiamenti_2 ON
tbl_ExC_Jahr_EquipaggiamentiAuto_2.IDEquip = tbl_ExC_Jahr_Equipaggiamenti_2.ID INNER JOIN
tbl_ExC_Jahr_Equipaggiamenti AS tbl_ExC_Jahr_Equipaggiamenti_3 ON
tbl_ExC_Jahr_EquipaggiamentiAuto_3.IDEquip = tbl_ExC_Jahr_Equipaggiamenti_3.ID
WHERE (tbl_ExC_Type_Carrozzeria.ID LIKE @param1) AND (tbl_ExC_Type_Alimentazione.ID LIKE @param2) AND (tbl_ExC_Type_Marca.ID LIKE @param3)
AND (tbl_ExC_Jahr_Type_Classe.ID LIKE @param4) AND (tbl_ExC_Jahr_Type_Modello.ID LIKE @param5) AND
(tbl_ExC_Jahr_Type_Linea.ID LIKE @param6) AND (SUBSTRING(tbl_ExC_Jahr_Auto.Identificazione, 4, 3) LIKE @param7) AND
(tbl_ExC_Jahr_Auto.KM >= @param8) AND (tbl_ExC_Type_Colore.ID LIKE @param9) AND (tbl_ExC_Type_Colore_1.ID LIKE @param10) AND
(tbl_ExC_Jahr_Auto.EUROfferta >= @param11) AND (tbl_ExC_Jahr_Auto.KM <= @param12) AND (tbl_ExC_Jahr_Auto.EUROfferta < @param13) AND
(YEAR(tbl_ExC_Jahr_Auto.Immatricolazione) >= @param14) AND (YEAR(tbl_ExC_Jahr_Auto.Immatricolazione) <= @param15) AND
(tbl_ExC_Jahr_Auto.EUROfferta / tbl_ExC_Jahr_Auto.EURListino < @param16) AND (tbl_ExC_Jahr_Auto.EqCambio LIKE @param17) AND
(tbl_ExC_Jahr_Auto.EqNav LIKE @param18) AND (tbl_ExC_Jahr_Auto.EqCerchi LIKE @param19) AND (tbl_ExC_Jahr_Auto.EqTetto LIKE @param20) AND
(tbl_ExC_Jahr_Auto.EqPark LIKE @param21) AND (tbl_ExC_Jahr_Auto.EqXeno LIKE @param22) AND (tbl_ExC_Jahr_Auto.EqSport LIKE @param23) AND
(tbl_ExC_Jahr_Auto.EqAMG LIKE @param24) AND (tbl_Com_RegioniItaliane.ID LIKE @param25) AND (tbl_Com_ProvinceItaliane.ID LIKE @param26)
AND (tbl_ExC_Jahr_Type_ColInterno.ID LIKE @param27 OR
tbl_ExC_Jahr_Type_ColInterno.ID LIKE @param28 OR
tbl_ExC_Jahr_Type_ColInterno.ID LIKE @param29) AND (tbl_ExC_Jahr_Type_ColEsterno.ID LIKE @param30 OR
tbl_ExC_Jahr_Type_ColEsterno.ID LIKE @param31 OR
tbl_ExC_Jahr_Type_ColEsterno.ID LIKE @param32) AND (tbl_ExC_Jahr_Equipaggiamenti.Codice LIKE @param33) AND
(tbl_ExC_Jahr_Equipaggiamenti_1.Codice LIKE @param34) AND (tbl_ExC_Jahr_Equipaggiamenti_2.Codice LIKE @param35)
AND (tbl_ExC_Jahr_Equipaggiamenti_3.Codice LIKE @param36)
GROUP BY tbl_ExC_Jahr_Auto.ID, tbl_ExC_Type_Marca.Nome, tbl_ExC_Jahr_Type_Modello.Nome, tbl_ExC_Jahr_Type_Linea.Nome,
tbl_ExC_Jahr_Type_ColInterno.Codice, tbl_ExC_Jahr_Type_ColEsterno.Codice, tbl_ExC_Jahr_Auto.KM, tbl_ExC_Jahr_Auto.Immatricolazione,
tbl_ExC_Jahr_Auto.EUROfferta, tbl_ExC_Jahr_Auto.EURListino, tbl_ExC_Jahr_Auto.EUROfferta * 100 / tbl_ExC_Jahr_Auto.EURListino,
tbl_ExC_Jahr_Auto.EURRiPePa / 100, tbl_ExC_Jahr_Auto.EqCambio, tbl_ExC_Jahr_Auto.EqNav, tbl_ExC_Jahr_Auto.EqCerchi,
tbl_ExC_Jahr_Auto.EqTetto, tbl_ExC_Jahr_Auto.EqPark, tbl_ExC_Jahr_Auto.EqXeno, tbl_ExC_Jahr_Auto.EqSport, tbl_ExC_Jahr_Auto.EqAMG,
tbl_Com_ProvinceItaliane.Sigla
ORDER BY tbl_ExC_Jahr_Auto.EUROfferta

-----
1.976 messaggi dal 27 luglio 2005
Contributi
salve,
djfdx wrote:
Ragazzi un aiuto veloce, cerco di essere chiaro e breve al tempo stesso: ho una tabella Auto ed una Optional, ed ho una pagina di ricerca delle auto in cui posso chiedere solo le auto che abbiano gli optional X ed Y.

Le tabelle sono così strutturate:

Auto:
--
--
ID
etc...

Optional
--

e' molto sbagliata la modellazione.. a te serve una modellazione molti a molti in quanto ogni optional puo' ovviamente essere presente su svariati autoveicoli, quindi ti serve una tabella intermedia, optional_auto, che raccolga la relazione molti a molti tra auto e optional, similarmente a
SET NOCOUNT ON;
USE tempdb;
GO
CREATE TABLE dbo.auto (
Id int NOT NULL,
Nome varchar(5)
);

CREATE TABLE dbo.optional (
Id int NOT NULL,
Nome varchar(5)
);

CREATE TABLE dbo.optional_auto (
IdOptional int NOT NULL,
IdAuto int NOT NULL,
);
GO
INSERT INTO dbo.auto VALUES ( 1, 'fiat') ;
INSERT INTO dbo.auto VALUES ( 2, 'opel') ;
INSERT INTO dbo.auto VALUES ( 3, 'alfa') ;

INSERT INTO dbo.optional VALUES ( 1, 'clima') ;
INSERT INTO dbo.optional VALUES ( 2, 'metal') ;
INSERT INTO dbo.optional VALUES ( 3, 'servo') ;

INSERT INTO dbo.optional_auto VALUES ( 1, 3) ;
INSERT INTO dbo.optional_auto VALUES ( 3, 3) ;
INSERT INTO dbo.optional_auto VALUES ( 3, 2) ;
INSERT INTO dbo.optional_auto VALUES ( 2, 1) ;
INSERT INTO dbo.optional_auto VALUES ( 2, 2) ;
INSERT INTO dbo.optional_auto VALUES ( 2, 3) ;
GO
SELECT *
FROM dbo.auto a
JOIN dbo.optional_auto oa ON oa.IdAuto = a.Id
JOIN dbo.optional o ON oa.IdOptional = o.Id
WHERE o.Id = 3 OR o.Id = 1
GO
DROP TABLE dbo.auto, dbo.optional, dbo.optional_auto;
--<--------
Id Nome IdOptional IdAuto Id Nome
---------
---
---------
---------
---------
-----
3 alfa 1 3 1 clima
3 alfa 3 3 3 servo
2 opel 3 2 3 servo

saluti

Andrea Montanari
http://www.hotelsole.com - http://www.hotelsole.com/asql/index.php
438 messaggi dal 04 agosto 2002
Contributi
ciao,

ti stavo giusto scrivendo: e se gli optional fossero 3? o 10?
Segui l'indicazione di Andrea!

v
22 messaggi dal 03 settembre 2008
Come si evince dalla query, la modellazione è corretta:

ho la tabella delle auto, quella degli optional, e quella delle relazioni optional-auto.

Il problema è un altro, e non riesco a venirne fuori senza dover scrivere la query a livello di codice... Insomma se riesco a farla funzionare come stored procedure sarebbe molto molto meglio...

A livello di logica non mi sembra una cosa così difficile, ma mi sfugge qualcosa, probabilmente sbaglio nell'utilizzo dei parametri o non so che altro...

Ripeto, i parametri sono il 33, 34, 35 e 36, se li lascio tutti a % la query mi restituisce tutte le auto, se chiedo solo l'optional X mi restituisce tutte le auto con l'optional X, se invece chiedo X ed Y non mi restituisce nulla... sto impazzendo! :P

---

L'unica soluzione che al momento mi viene in mente è questa:

una query preliminare del tipo:

SELECT COUNT(*), tbl_ExC_Jahr_EquipaggiamentiAuto.IDAuto FROM tbl_ExC_Jahr_Equipaggiamenti INNER JOIN tbl_ExC_Jahr_EquipaggiamentiAuto ON
tbl_ExC_Jahr_Equipaggiamenti.ID = tbl_ExC_Jahr_EquipaggiamentiAuto.IDEquip WHERE
tbl_ExC_Jahr_Equipaggiamenti.Codice LIKE '525' OR tbl_ExC_Jahr_Equipaggiamenti.Codice LIKE '404'
GROUP BY tbl_ExC_Jahr_EquipaggiamentiAuto.IDAuto
HAVING COUNT(*) = '2'

che mi restituisce gli id delle sole auto che mi interessano, quindi procedo a selezionare tutti i dettagli delle auto con quell'id facendo "WHERE ID IN..."
ma dovrei farlo a livello di codice, e supererei facilmente il limite di parametri passabili...
Modificato da djfdx il 03 settembre 2008 18.52 -
438 messaggi dal 04 agosto 2002
Contributi
djfdx ha scritto:
Come si evince dalla query, la modellazione è corretta:

ho la tabella delle auto, quella degli optional, e quella delle relazioni optional-auto.

scusa, sono stato precipitoso, non avevo letto il "malloppo" ;)

Comunque mi sa che ti stai complicando la vita; perchè anzichè l'operatore like non usi IN sull'id degli optional?

Se vuoi trovare tutte le auto con optionalid uguali a 1, 3, 7, basta mettere
select ...[malloppo] where ... AND optionalid IN(1, 3, 7)

v
22 messaggi dal 03 settembre 2008
Ok, domani provo e vi faccio sapere!

Grazie a tutti per la pazienza e la collaborazione :)

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.