2010-03-22 5 views
0

plus compliqué que j'ai deux tables:MYSQL - Aide avec une requête

tbl_lists et tbl_houses

intérieur tbl_lists J'ai un champ appelé HousesList - il contient l'ID est pour plusieurs maisons dans le format suivant:

1# 2# 4# 51# 3# 

Je dois être en mesure de sélectionner les champs mysql de tbl_houses WHERE ID = l'un de ces ID dans la liste. Plus précisément, je dois SELECT SUM(tbl_houses.HouseValue) WHERE tbl_houses.ID IN tbl_lists.HousesList - et je veux faire ceci sélectionner pour retourner le SUM pour plusieurs lignes tbl_lists.

Quelqu'un peut-il aider? Je pense à la façon dont je peux le faire dans une requête UNIQUE puisque je ne veux pas faire de mysql loops (dans PHP).

+0

J'essaie actuellement quelque chose comme: tbl_lists.HousesList COMME CONCAT ('%', tbl_houses.ID, '#') travail ..pas lol ... il sélectionne uniquement les premier enregistrement dans la liste – Joe

+0

Stocker des listes dans des champs n'est généralement pas une bonne idée. Pouvez-vous changer le schéma, ou est-ce hors de votre contrôle? – Simon

+0

Je stocke des listes dans des champs pour éviter le besoin de noms de champs uniques puisque mon projet est hautement dynamique. Ne va pas changer ça. Ne vous inquiétez pas, je ne fais cela que pour des choses spécifiques qui nécessitent des noms de champs plus dynamiques. – Joe

Répondre

0

Si votre schéma est vraiment fixé, je ferais deux requêtes:

SELECT HousesList FROM tbl_lists WHERE ... (your conditions)

En PHP, diviser les listes et de créer un tableau de houseIDs $ d'ID. Ensuite, exécutez une seconde requête:

SELECT SUM(HouseValue) FROM tbl-Houses WHERE ID IN ( .join (",", $ houseIDs). )

Je suggère encore modifier le schéma en quelque chose comme ceci:

CREATE TABLE tbl_lists (listID int primary key, ...) 
CREATE TABLE tbl_lists_houses (listID int, houseID int) 
CREATE TABLE tbl_houses (houseID int primary key, ...) 

Ensuite, la requête devient trivial:

SELECT SUM(h.HouseValue) FROM tbl_houses AS h, tbl_lists AS l, tbl_lists_houses AS lh WHERE l.listID = <your value> AND lh.listID = l.listID AND lh.houseID = h.houseID

Stockage des listes dans un seul champ vous empêche vraiment de faire quoi que ce soit utile avec eux dans la base de données, et vous allez aller et venir entre PHP et la base de données pour tout. Aussi (sans vouloir offenser), "mon projet est hautement dynamique" pourrait être une mauvaise excuse pour "je n'ai pas encore d'exigences ni de design".

+0

Merci, je vais regarder dans cela.Non, je pensais avoir une table séparée pour chaque liste les stockant de cette façon, mais je finirai par avoir besoin de centaines de tables juste pour stocker des identifiants. Ce ne sont pas seulement les tbl_lists_houses, mais bien d'autres ... tbl_lists_boats, etc. etc. et chaque table nécessiterait aussi des noms de champs différents. Les listes étaient beaucoup plus efficaces, mais j'ai peut-être oublié quelque chose. Quoi qu'il en soit, merci encore, je vais examiner cela. – Joe

+0

BTW Je risque de ne pas avoir besoin de cette requête et de stocker le SUMS séparément, car j'ai besoin d'éviter autant que possible les appels de requête. – Joe