1
votes

Afficher la colonne de plusieurs tables

J'ai donc 4 tables et il y a des colonnes en double, et je veux sélectionner des colonnes de chaque table et afficher chaque colonne des 4 tables.

table système

+------+------+-------+--------+-------+------+--------+-------+----------+-------+---------+
| reg  | name |  ic   | plate  | color | year |  make  | model | capacity | type  | maxload |
+------+------+-------+--------+-------+------+--------+-------+----------+-------+---------+
| 1000 | John | 22222 | WWW123 | blue  | 2015 | Honda  | City  |      1.5 | car   |         |
| 1001 | Joe  | 11111 | BBB987 | red   | 2018 | Toyota | Hilux |      2.0 | truck |    3000 |
+------+------+-------+--------+-------+------+--------+-------+----------+-------+---------+


4 commentaires

Il n'y a pas de Java ou de PHP impliqué ici ... En ce qui concerne le SQL, dans quelle mesure êtes-vous familier avec les jointures et la sélection de colonnes individuelles? Aussi pourquoi avez-vous une table pour voitures et camions si la seule différence est la charge maximale? Avoir une table (ou une vue qui combine les deux) avec un «type» de colonne supplémentaire rendrait la requête beaucoup plus facile.


Astuce: JOIN . Et JOIN à nouveau.


Ok, je vais l'essayer


Je combinerais la table du camion et de la voiture et autoriserais la charge maximale à être nulle. Plus facile


3 Réponses :


0
votes

Vous pouvez essayer ci-dessous -

select reg,name,A.ic,A.plate,color,year,make,model,capacity,type,maxload 
from systemtable A
inner join ownertable B on A.ic=B.ic
join
(
select plate, color ,year ,make ,model, capacity,null as maxload from car
union all
select plate, color ,year ,make ,model, capacity,maxload from truck
)C on A.plate=C.plate


6 commentaires

Il montre que "le type de colonne dans la liste des champs est ambigu"


pourquoi la valeur de votre colonne ic est différente dans vos deux tables une est 22222 dans la table système et la table propriétaire 2222 ?? @Michael


Merci!! , j'ai donc essayé d'ajouter where plate = '% s' ou ic = '% s' derrière le sql, et cela provoquait cette erreur ** Colonne 'plate' dans la clause where est ambiguë **


utilisez A.plate @Michael


pour ma mise à jour sql, j'ai fait ceci: "UPDATE car` SET plate = '% s', color = '% s', année = '% s', make = '% s', model = '% s', capacit‌ y =%. 2f WHERE regno = "`, mais je me rends compte qu'il n'y a pas de colonne regno dans la table car, que dois-je faire si j'insiste pour utiliser regno


pouvez-vous utiliser la plaque no pour trouver le reg no @Michael



0
votes

C'est un cas pour les instructions de jointure. Puisque vous voulez trouver l'intersection entre les tables, nous allons utiliser UNION ALL + une jointure interne (en sélectionnant les valeurs correspondant dans plusieurs tables).

SELECT name, ic, req, plate, year, color, make, model, capacity, maxload 
FROM ((SELECT * FROM car c WHERE c.plate=plate) UNION ALL (SELECT * FROM truck AS t WHERE t.plate=plate))
INNER JOIN owner AS o ON o.ic=ic

Essayez de l'exécuter. Vous devrez peut-être spécifier tous les champs de voiture et de camion au lieu d'utiliser l'astérisque (*)

/ AF


0 commentaires

0
votes

Similaire à d'autres réponses. Mais voilà.

Structure de la table et données

+-------+-------+--------+---------+--------+--------+-------+---------+--------+-----------+---------+
| reg   | name  |  ic    | plate   | type   | color  | year  |  make   | model  | capacity  | maxload |
+-------+-------+--------+---------+--------+--------+-------+---------+--------+-----------+---------+
| 1000  | john  | 22222  | WWW123  | car    | blue   | 2015  | Honda   | City   |      1.5  | (null)  |
| 1001  | joe   | 11111  | BBB987  | truck  | red    | 2018  | Toyota  | Hilux  |        2  | 3000    |
+-------+-------+--------+---------+--------+--------+-------+---------+--------+-----------+---------+

Requête SQL

SELECT systemtbl.reg,
       ownertbl.name,
       systemtbl.ic,
       systemtbl.plate,
       systemtbl.type,
       tmp.color,
       tmp.year,
       tmp.make,
       tmp.model,
       tmp.capacity,
       tmp.maxload
FROM   (SELECT plate, color, year, make, model, capacity, NULL AS maxload
        FROM   cartbl
        UNION ALL
        SELECT plate, color, year, make, model, capacity, maxload
        FROM   trucktbl) tmp
       INNER JOIN systemtbl USING (plate)
       INNER JOIN ownertbl USING (ic)

Sortie

XXX

Démo en ligne: http://sqlfiddle.com / #! 9 / 52596e / 3/0


1 commentaires

@Michael, Juste un alias pour cette requête: 'SELECT plaque, couleur, année, marque, modèle, capacité, NULL AS maxload FROM cartbl UNION ALL SELECT plaque, couleur, année, marque, modèle, capacité, maxload FROM trucktbl '. Vous pouvez le remplacer par le nom de votre choix. (t1, tmp, abc, etc.). Si cela rend la requête plus difficile à comprendre, je la remplacerai par 'tmp' .