Projet

Général

Profil

query pgsql - lier fisrtname lastname et exten pour un userfield identique

Ajouté par dudu clx il y a plus de 7 ans

Bonjour,

je cherche à pouvoir afficher un tableau via une requête pgsql (sous un site web en php), qui affiche:
firstname | lastname | exten | userfield

je n'y arrive pas avec les tables userfeatures et call_log,

mais vu que lors d'un export des utilisateurs via .csv, on retrouve tous ces champs, je me dis que c'est possible.

j'ai regardé quelques tables mais impossible de trouver ... même en comptant sur un "inner join" entre 2 tables.

un peu d'aide pour m'aiguiller ?

dans l'idée:
select
firstname as prenom,
lastname as nom,
exten as numero
from "la table magique"
where userfield = "le service"
order by numero asc
;

si en plus je peux avoir les identifiants SIP, ça serait nikel !
je pourrais faire une interface connectée au LDAP où l'utilisateur pourra voir uniquement ses identifiants, au cas où il aient envie d'installer un client sip !

ça donnerai:
firstname | lastname | exten | userfield | sip_username | sip_secret

Merci !


Réponses (4)

RE: query pgsql - lier fisrtname lastname et exten pour un userfield identique - Ajouté par Etienne Allovon il y a plus de 7 ans

Bonjour,

Le lien entre le user (la personne), la ligne (le compte SIP) et l'extension (le numéro) est dans la table user_line.

La description de la table user_line avec les clés étrangères :

asterisk=> \d user_line
                            Table "public.user_line"
    Column    |  Type   |                       Modifiers                        
--------------+---------+--------------------------------------------------------
 id           | integer | not null default nextval('user_line_id_seq'::regclass)
 user_id      | integer | 
 line_id      | integer | not null
 extension_id | integer | 
 main_user    | boolean | not null
 main_line    | boolean | not null
Indexes:
    "user_line_pkey" PRIMARY KEY, btree (id, line_id)
    "user_line_user_id_line_id_key" UNIQUE CONSTRAINT, btree (user_id, line_id)
Foreign-key constraints:
    "user_line_extension_id_fkey" FOREIGN KEY (extension_id) REFERENCES extensions(id)
    "user_line_line_id_fkey" FOREIGN KEY (line_id) REFERENCES linefeatures(id)
    "user_line_user_id_fkey" FOREIGN KEY (user_id) REFERENCES userfeatures(id)

Pour :
firstname | lastname | exten | userfield
il faut donc faire une jointure entre userfeatures, extensions et user_line

Pour :
firstname | lastname | exten | userfield | sip_username | sip_secret
il faut donc faire une jointure entre userfeatures, linefeatures, extensions et user_line

RE: query pgsql - lier fisrtname lastname et exten pour un userfield identique - Ajouté par dudu clx il y a plus de 7 ans

Merci !!

je débute en pgsql ... avec des "natural join" je n'ai pas réussi, ni en utilisant les "foreign key".

bon, j'arrive à avoir un tableau juste, pas sûr que ça soit la plus belle query possible, mais ça marche:

pour:
exten | firstname | lastname | userfield

query:
select exten, firstname, lastname from user_line, extensions, userfeatures where extensions.id = user_line.extension_id and user_line.user_id = userfeatures.id and userfield = 'dgdsi' order by exten;

dans mon cas, je recherche uniquement le champ userfield = 'dgdsi' (je dis ça pour les copier-coller).

he ben je vais passer à la suivante et ajouter les champs sip_*

je viendrais la partager ici, si jamais ça intéresse un lecteur.

encore merci !

RE: query pgsql - lier fisrtname lastname et exten pour un userfield identique - Ajouté par dudu clx il y a plus de 7 ans

hop, je reviens.

il manquait la table usersip.

voilà une query assez complète:

$query_asterisk = "SELECT
exten AS numero,
firstname AS prenom,
lastname AS nom,
linefeatures.name AS user_sip,
usersip.secret AS password_sip,
provisioningid AS code_appro
FROM user_line, extensions, userfeatures, linefeatures, usersip
WHERE extensions.id = user_line.extension_id
AND user_line.user_id = userfeatures.id
AND extensions.exten = linefeatures.number
AND linefeatures.name = usersip.name
AND linefeatures.number = '$numero'
ORDER BY exten ASC";

j'utilise "AND linefeatures.number = '$numero'" car j'ai un formulaire de recherche par le numéro.

je pense qu'il y a toujours mieux comme query, mais il n'existe pas de foreign key entre user_line et usersip.
bizarre ...

bon,
gourmand comme je suis, je vais tenter d'ajouter l'adresse ip de la terminaison
(comme ça le support pourra trouver l'ip et savoir si le téléphone est sur le réseau, au lieu de me déranger pour rien )

Mais c'est pas gagné, pas d'adresse ip trouvé dans les tables que me retourne:
select table_name from INFORMATION_SCHEMA.COLUMNS
where COLUMN_NAME like '%addr%'
order by TABLE_NAME;

logiquement, il doit exister un lien entre usersip et l'adresse ip, mais je vois pas où.

et rien dans le row "ipaddr" de la table "usersip", c'est vide !

Une idée où je peux choper l'adresse IP de la terminaison d'une ligne ??

Et j'y pense, faudrait que je pense à ajouter le username et password du CTI profil également.

Merci !

RE: query pgsql - lier fisrtname lastname et exten pour un userfield identique - Ajouté par dudu clx il y a plus de 7 ans

Up,

Bon impossible de retrouver une terminaison et son IP sur la database asterisk ...

Si quelqu'un sait, merci de passer par là.

Pour ceux que ça intéresse, voici une requête qui est presque celle de l'export des utilisateurs en .csv
Malheureusement, je me rend compte que ceux qui n'ont pas de terminaison (client sip et non un téléphone) n'apparaissent pas dans le résultat.
Donc si quelqu'un veut corriger cela:

`SELECT 
userfeatures.uuid AS uuid,
userfeatures.entityid AS entity_id,
userfeatures.firstname AS firstname,
userfeatures.lastname AS lastname,
userfeatures.email AS email,
userfeatures.mobilephonenumber AS mobile_phone_number,
userfeatures.outcallerid AS outgoing_caller_id,
userfeatures.language AS language,
userfeatures.ringseconds AS ring_seconds,
userfeatures.simultcalls AS simultaneous_calls,
userfeatures.enablehint AS supervision_enabled,
userfeatures.enablexfer AS call_transfer_enabled,
userfeatures.userfield AS userfield,
userfeatures.loginclient AS username,
userfeatures.passwdclient AS password,
cti_profile.name AS cti_profile_name,
userfeatures.enableclient AS cti_profile_enabled,
voicemail.fullname AS voicemail_name,
voicemail.mailbox AS voicemail_number,
voicemail.context AS voicemail_context,
voicemail.password AS voicemail_password,
voicemail.email AS voicemail_email,
voicemail.attach AS voicemail_attach_audio,
voicemail.deletevoicemail AS voicemail_delete_messages,
voicemail.skipcheckpass AS voicemail_ask_password, 
usersip.protocol AS line_protocol,
linefeatures.provisioningid AS provisioning_code,
extensions.context AS context,
linefeatures.name AS sip_username,
usersip.secret AS sip_secret,
extensions.exten AS exten,
linefeatures.number AS incall_exten,
string_agg(rightcall.name, ';') AS call_permissions
FROM user_line, extensions, userfeatures, linefeatures, usersip, voicemail, rightcallmember, rightcall, cti_profile
WHERE user_line.extension_id = extensions.id
AND user_line.user_id = userfeatures.id
AND user_line.user_id = linefeatures.id
AND linefeatures.number = extensions.exten
AND linefeatures.name = usersip.name
AND userfeatures.voicemailid = voicemail.uniqueid
AND rightcallmember.rightcallid = rightcall.id
AND rightcallmember.typeval = extensions.typeval
AND userfeatures.cti_profile_id = cti_profile.id
GROUP BY 1, 2, 3, 4, 5 ,6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32
ORDER BY exten ASC;`

Merci !

    (1-4/4)