[MySQL] Problème avec une requête...

Problème avec une requête... [MySQL] - Programmation

Marsh Posté le 24-08-2002 à 10:10:26    

Voilà... j'ai une table qui se présente à peu près comme ça :
 
id | chemin | titre | ...
-------------------------
 
sachant que j'ai plusieurs entrées dans cette table (!), je voudrais à partir de plusieurs id sélectionner la ligne dont le chemin est identique pour ces id...
Par exemple j'ai ça :
 
1 | rep1 | titre1
2 | rep2 | titre2
3 | rep1 | titre1
3 | rep2 | titre2
 
Si je fais ma sélection sur les id 1 et 3 je voudrai que ma requête me renvoie rep1 et titre1.
C'est possible?
Ou faut que j'utilise un traitement PHP derrière?
 :??:

Reply

Marsh Posté le 24-08-2002 à 10:10:26   

Reply

Marsh Posté le 24-08-2002 à 10:22:43    

"SELECT UNION..." , je connais plus la syntaxe exacte...
 
 
telecharge la doc MySQL ici tu auras toutes tes reponses ....  
 
http://dev.nexen.net/docs/mysql/chargement.html

Reply

Marsh Posté le 24-08-2002 à 10:23:47    

ok merci je vais regarder çà!

Reply

Marsh Posté le 24-08-2002 à 11:00:24    

ah ouais mais apparement ça ne marche que sous MySQL 4.0...
je suis sous une 3.23.xx
Z'auriez pas une autre solution?

Reply

Marsh Posté le 24-08-2002 à 11:43:22    

bin normallement c'est select distinct( ...) mais je ne sais pas si c supporté mar mysql


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 24-08-2002 à 11:45:13    

DarkLord a écrit a écrit :

bin normallement c'est select distinct( ...) mais je ne sais pas si c supporté mar mysql




 
select distinct c'est assez standard donc je suppose que mysql le reconnait.


---------------
[:kuroineko] Francois.P tel: (+33)617230820 http://www.ifrance.com/fpussault  fpussault@caramail.com
Reply

Marsh Posté le 24-08-2002 à 12:18:05    

oui mais avec distinct je ne vais pas avoir ce que je veux  :??:  
Je veux en fait sélectionner les lignes qui auraient l'ID a ou b ET ayant le même chemin (qui est à trouver dans la table...)
Je crois pas que ce soit faisable en une seule requête?

Reply

Marsh Posté le 24-08-2002 à 12:21:15    

comment veux tu qu'on devine ce que tu veux faire si tu le précises pas !


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 24-08-2002 à 12:24:11    

ben j'avé essayé de l'expliquer au début! mais c pas facile à faire comprendre dsl!

Reply

Marsh Posté le 24-08-2002 à 12:26:33    

qu'est ce que tu appelles par chemin déjà ...


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 24-08-2002 à 12:26:33   

Reply

Marsh Posté le 24-08-2002 à 12:32:37    

c un des champ de ma table

Citation :

Voilà... j'ai une table qui se présente à peu près comme ça :  
 
id | chemin | titre | ...  
-------------------------  

Reply

Marsh Posté le 24-08-2002 à 12:42:06    

toutoune a écrit a écrit :

c un des champ de ma table

Citation :

Voilà... j'ai une table qui se présente à peu près comme ça :  
 
id | chemin | titre | ...  
-------------------------  






 
un record tu veux dire? Un champ c'est la valeur d'une colonne d'un record ...


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 24-08-2002 à 12:49:16    

bien écoute, sous PHPMyAdmin par exemple, quand je fais créer une nouvelle table, il me demande le nom bre de CHAMPS que je souhaite... j'appelle donc ça une champ  :??:  
Sinon as-tu compris ma question ou tu veux que j'apporte des précisions?

Reply

Marsh Posté le 24-08-2002 à 13:04:36    

toutoune a écrit a écrit :

oui mais avec distinct je ne vais pas avoir ce que je veux  :??:  
Je veux en fait sélectionner les lignes qui auraient l'ID a ou b ET ayant le même chemin (qui est à trouver dans la table...)
Je crois pas que ce soit faisable en une seule requête?




SELECT T1.ID, T1.REP, T1.TITRE
FROM TaTable T1, TaTable T2
WHERE T1.ID IN (a, b)
AND T2.ID IN (a, b)
AND T2.ID <> T1.ID
AND T1.REP || T1.TITRE = T2.REP || T2.REP
 
A priori, ça doit marcher.
 
Par contre, j'avoue que j'en suis pas sûr du tout et que j'ai la flèmme de tester :D
 
Par contre, ton besoin de semble bizarre. Tu veux expliquer en détail ce que tu veux faire, dans quel contexte ?
 
Parceque ça me semble bizarre de vouloir récupérer ça comme ça :heink:


Message édité par MagicBuzz le 24-08-2002 à 13:05:45
Reply

Marsh Posté le 24-08-2002 à 13:05:23    

DarkLord a écrit a écrit :

 
 
un record tu veux dire? Un champ c'est la valeur d'une colonne d'un record ...




Un record, c'est une ligne (retournée par une requête), un champ c'est une colonne ;)

Reply

Marsh Posté le 24-08-2002 à 13:05:59    

toutoune a écrit a écrit :

bien écoute, sous PHPMyAdmin par exemple, quand je fais créer une nouvelle table, il me demande le nom bre de CHAMPS que je souhaite... j'appelle donc ça une champ  :??:  




 
tu confonds colonnes et ligne ...


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 24-08-2002 à 13:06:12    

arf grillaid :(


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 24-08-2002 à 13:49:21    

MagicBuzz a écrit a écrit :

 
Par contre, ton besoin de semble bizarre. Tu veux expliquer en détail ce que tu veux faire, dans quel contexte ?
 
Parceque ça me semble bizarre de vouloir récupérer ça comme ça :heink:




Ok je vais expliquer en gros...
J'ai fait un moteur de recherche qui indexe automatiquement toutes mes pages.
Grace à mes tables, je sais dans quelle(s) page(s) je peux trouver quel mot.
Et j'ai besoin de faire ça lorsque j'effectue une recherche sur toute une expression. Je recherche alors LA page qui contient ces deux mots. (mes mots sont identifiés par le 'id';)
C'est plus clair?
En tout cas merci je vais essayer ça ce soir!
@+  :hello:  

Reply

Marsh Posté le 24-08-2002 à 13:59:38    

repense ton data model il est pourris. Si il était bien pensé ca serait BCP plus simple de faire ce genre de requête ...


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 24-08-2002 à 14:07:29    

Bon, ma réponse doit faire ce que tu veux alors.
 
PS: c'est quand je lis ce genre de topic que jeme dis que M$ à vraiment eu une très bonne idée que d'intégrer "FullTextSearch" à SQL Server, et IndexServer pour les pages statiques... Comment ça simplicite la vie :love:


Message édité par MagicBuzz le 24-08-2002 à 14:08:49
Reply

Marsh Posté le 24-08-2002 à 14:32:36    

mais c pas standard ...


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 24-08-2002 à 16:00:02    

DarkLord a écrit a écrit :

mais c pas standard ...




Qu'est-ce qui n'est pas standard :??:

Reply

Marsh Posté le 24-08-2002 à 17:34:36    

MagicBuzz a écrit a écrit :

 
Qu'est-ce qui n'est pas standard :??:




 
bin les fonctionnalités de sql server tiens ...


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 24-08-2002 à 17:42:08    

C'est pas des fonctionnalités, c'est des procédures stockées (du moins, c'est implémenté de façon à tourner comme une PS) donc si, c'est tout ce qu'il y a de plus standard.
 
Rien n'empêche un éditeur de développer des PS avec une interface compatible pour oracle et les requêtes seront portables.
 
Au contraire, M$ pour un coup s'est bien démerdé. Ils ont fait ça proprement sans ajouter d'instruction au langage T-SQL (qui fait l'objet d'une norme déposée) qui est par ailleurs 95% compatible avec le PL/SQL (l'autre standard)


Message édité par MagicBuzz le 24-08-2002 à 17:58:04
Reply

Marsh Posté le 24-08-2002 à 17:45:48    

[HS] Voici la doc de SQL Server 2K pour une des fonctions de FullTextSearch.
La fonction retourne une table temporaire capable d'être utilisée lors d'une jointure par exmple.
L'appel de la fonction est identique à n'importe quelle fonction écrite en T-SQL (ou PL/SQL)
 

Citation :

CONTAINSTABLE
Returns a table of zero, one, or more rows for those columns containing character-based data types for precise or fuzzy (less precise) matches to single words and phrases, the proximity of words within a certain distance of one another, or weighted matches. CONTAINSTABLE can be referenced in the FROM clause of a SELECT statement as if it were a regular table name.
 
Queries using CONTAINSTABLE specify contains-type full-text queries that return a relevance ranking value (RANK) for each row. The CONTAINSTABLE function uses the same search conditions as the CONTAINS predicate.
 
Syntax
CONTAINSTABLE ( table , { column | * } , ' < contains_search_condition > '  
    [ , top_n_by_rank ] )  
 
< contains_search_condition > ::=  
        { < simple_term >  
        | < prefix_term >  
        | < generation_term >  
        | < proximity_term >  
        |  < weighted_term >  
        }  
        | { ( < contains_search_condition > )  
        { AND | AND NOT | OR } < contains_search_condition > [ ...n ]  
        }
 
< simple_term > ::=  
    word | " phrase "
 
< prefix term > ::=  
    { "word * " | "phrase * " }  
 
< generation_term > ::=  
    FORMSOF ( INFLECTIONAL , < simple_term > [ ,...n ] )  
 
< proximity_term > ::=  
    { < simple_term > | < prefix_term > }  
    { { NEAR | ~ } { < simple_term > | < prefix_term > } } [ ...n ]  
 
< weighted_term > ::=  
    ISABOUT
        ( { {  
                < simple_term >  
                | < prefix_term >  
                | < generation_term >  
                | < proximity_term >  
                }  
            [ WEIGHT ( weight_value ) ]  
            } [ ,...n ]  
        )  
 
Arguments
table
 
Is the name of the table that has been marked for full-text querying. table can be a one-, two-, or three-part database object name. For more information, see Transact-SQL Syntax Conventions. table cannot specify a server name and cannot be used in queries against linked servers.
 
column
 
Is the name of the column to search, which resides in table. Columns of the character string data types are valid full-text searching columns.
 
*
 
Specifies that all columns in the table that have been registered for full-text searching should be used to search for the given contains search condition(s).  
 
top_n_by_rank
 
Specifies that only the n highest ranked matches, in descending order, are returned. Applies only when an integer value, n, is specified.
 
<contains_search_condition>
 
Specifies some text to search for in column. Variables cannot be used for the search condition. For more information, see CONTAINS.  
 
Remarks
The table returned has a column named KEY that contains full-text key values. Each full-text indexed table has a column whose values are guaranteed to be unique, and the values returned in the KEY column are the full-text key values of the rows that match the selection criteria specified in the contains search condition. The TableFulltextKeyColumn property, obtained from the OBJECTPROPERTY function, provides the identity for this unique key column. To obtain the rows you want from the original table, specify a join with the CONTAINSTABLE rows. The typical form of the FROM clause for a SELECT statement using CONTAINSTABLE is:
 
SELECT select_list
FROM table AS FT_TBL INNER JOIN
   CONTAINSTABLE(table, column, contains_search_condition) AS KEY_TBL
   ON FT_TBL.unique_key_column = KEY_TBL.[KEY]
 
The table produced by CONTAINSTABLE includes a column named RANK. The RANK column is a value (from 0 through 1000) for each row indicating how well a row matched the selection criteria. This rank value is typically used in one of these ways in the SELECT statement:  
 
In the ORDER BY clause to return the highest-ranking rows as the first rows in the table.
 
 
In the select list to see the rank value assigned to each row.
 
 
In the WHERE clause to filter out rows with low rank values.  
CONTAINSTABLE is not recognized as a keyword if the compatibility level is less than 70. For more information, see sp_dbcmptlevel.  
 
Permissions
Execute permissions are available only by users with the appropriate SELECT privileges on the table or the referenced table's columns.
 
Examples
A. Return rank values using CONTAINSTABLE  
This example searches for all product names containing the words breads, fish, or beers, and different weightings are given to each word. For each returned row matching this search criteria, the relative closeness (ranking value) of the match is shown. In addition, the highest ranking rows are returned first.
 
USE Northwind
GO
SELECT FT_TBL.CategoryName, FT_TBL.Description, KEY_TBL.RANK
FROM Categories AS FT_TBL INNER JOIN  
   CONTAINSTABLE(Categories, Description,  
   'ISABOUT (breads weight (.8),  
   fish weight (.4), beers weight (.2) )' ) AS KEY_TBL
   ON FT_TBL.CategoryID = KEY_TBL.[KEY]
ORDER BY KEY_TBL.RANK DESC
GO
 
B. Return rank values greater than specified value using CONTAINSTABLE
This example returns the description and category name of all food categories for which the Description column contains the words "sweet and savory" near either the word "sauces" or the word "candies." All rows with a category name "Seafood" are disregarded. Only rows with a rank value of 2 or higher are returned.  
 
USE Northwind
GO
SELECT FT_TBL.Description,  
   FT_TBL.CategoryName,  
   KEY_TBL.RANK
FROM Categories AS FT_TBL INNER JOIN
   CONTAINSTABLE (Categories, Description,  
      '("sweet and savory" NEAR sauces) OR
      ("sweet and savory" NEAR candies)'
   ) AS KEY_TBL
   ON FT_TBL.CategoryID = KEY_TBL.[KEY]
WHERE KEY_TBL.RANK > 2
   AND FT_TBL.CategoryName <> 'Seafood'
ORDER BY KEY_TBL.RANK DESC
 
C. Return top 10 ranked results using CONTAINSTABLE and Top_n_by_rank
This example returns the description and category name of the top 10 food categories where the Description column contains the words "sweet and savory" near either the word "sauces" or the word "candies."  
 
SELECT FT_TBL.Description,  
   FT_TBL.CategoryName,  
   KEY_TBL.RANK
FROM Categories AS FT_TBL INNER JOIN
   CONTAINSTABLE (Categories, Description,  
      '("sweet and savory" NEAR sauces) OR
      ("sweet and savory" NEAR candies)'
      , 10
   ) AS KEY_TBL
   ON FT_TBL.CategoryID = KEY_TBL.[KEY]


Message édité par MagicBuzz le 24-08-2002 à 17:46:00
Reply

Marsh Posté le 24-08-2002 à 19:28:40    

DarkLord a écrit a écrit :

repense ton data model il est pourris. Si il était bien pensé ca serait BCP plus simple de faire ce genre de requête ...




T'a une meilleure idée?  :??:  
Pour moi, le fait de savoir dans quelles pages se trouve quel mot et avec quelle fréquence me semble être le plus simple non?

Reply

Marsh Posté le 24-08-2002 à 19:32:12    

Ca te dis pas de stocker plutôt les textes de tes pages dans la base ?
 
Ca sera un peu plus simple non ?

Reply

Marsh Posté le 24-08-2002 à 19:37:17    

toutoune a écrit a écrit :

 
T'a une meilleure idée?  :??:  
Pour moi, le fait de savoir dans quelles pages se trouve quel mot et avec quelle fréquence me semble être le plus simple non?




 
vi mais c la façon dont tu représentes l'info en base qui fait que ta requete est compliquée ...


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 24-08-2002 à 19:39:49    

C'est vrai que déjà, tu peux ajouter un champ "NB" qui contient le nombre d'occurences du mot dans la page.
 
Et comme ça tu peux même te lancer dans des fonctions plus complexes, permettant de pondérer le nombre d'occurences par le ration de présence de chaque mot clé, afin de savoir si en plus de contenir les mots, la page parle ou non de la chose...

Reply

Marsh Posté le 24-08-2002 à 19:49:37    

MagicBuzz a écrit a écrit :

Ca te dis pas de stocker plutôt les textes de tes pages dans la base ?
 
Ca sera un peu plus simple non ?




Oui mais un site complet dans une base de données... je trouve que ça fais un peu de la place perdue non?
Là pour un site de 300 pages (générables) environ, j'ai une base de 4Mo.
 
 

MagicBuzz a écrit a écrit :

 
C'est vrai que déjà, tu peux ajouter un champ "NB" qui contient le nombre d'occurences du mot dans la page.  
 
Et comme ça tu peux même te lancer dans des fonctions plus complexes, permettant de pondérer le nombre d'occurences par le ration de présence de chaque mot clé, afin de savoir si en plus de contenir les mots, la page parle ou non de la chose...




C'est déjà fait. J'avais dit plus haut que 'en gros' la table se présentait avec id/champ/titre. Mais j'ai aussi 'poids' et 'description'

Reply

Marsh Posté le 24-08-2002 à 20:05:38    

Alors pourquoi tu as des doublons  :heink:

Reply

Marsh Posté le 24-08-2002 à 21:36:09    

des doublons parce qu'on mot peut se trouver dans plusieurs pages différentes!


Message édité par toutoune le 24-08-2002 à 21:36:19
Reply

Marsh Posté le 24-08-2002 à 21:48:57    

oui mais "chemin" et "titre" seront différents dans ce cas...

Reply

Marsh Posté le 24-08-2002 à 22:55:34    

oui et alors?
(comme ils sont différents ce ne sont donc pas des doublons!)
 
Je te suis plus là!

Reply

Marsh Posté le 24-08-2002 à 23:38:06    

toutoune a écrit a écrit :

oui et alors?
(comme ils sont différents ce ne sont donc pas des doublons!)
 
Je te suis plus là!




ben utilise ton ancienne requête et utilise le champ "NB" en plus dans le seclet et voilà :)

Reply

Marsh Posté le 24-08-2002 à 23:39:48    

euh... koi que non... après relecture, je mélange avec un autre topic (un problème à moi :D)

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed