Jump to content



SQL - αναφορά σε στήλη χωρίς το όνομά της


neuromancer

Recommended Posts

Δημοσιεύτηκε

Υπάρχει τρόπος να αναφερθώ σε μια στήλη ενός πίνακα χωρίς να

χρησιμοποιήσω το όνομα της στήλης?

Θυμάμαι σε Delphi/Paradox έγραφες mytable.fields[0] και εννοούσες

την πρώτη στήλη του πίνακα.

Έχει κάτι αντίστοιχο σε SQLi ή σε PDO;

(php/myslq ειναι το σκηνικό)

Με αυτό εδώ μπορείς να μάθεις το όνομα της πρώτης στήλης δεδομένου πίνακα δεδομένης database.

SELECT column_name

FROM information_schema.columns

WHERE table_schema='myDatabase' AND table_name='myTable' AND ordinal_position=1;

Δε βολεύει βέβαια....

Γιατί θες να το κάνεις αυτό ?

Μια ιδέα είναι να κάνεις declare τα colums στο php script σου και να τα καλείς με άλλο όνομα αν αυτός είναι ο σκοπός σου ( δεν βρίσκω χρήση για αυτό αλλά τέσπα ).

Dynamic SQL δεν θες να χρησιμοποιήσεις φαντάζομαι.

Θέλω να γεμίζω μια λίστα με data από δίστηλο πίνακα αλλά θέλω να δουλεύει ασχέτως του ποιος είναι ο πίνακας και πώς λέγονται οι 2 στήλες του. Θέλω π.χ. να κάνω ordering στη δευτερη στήλη.

Λογικά τώρα θα παραδεχτείς ότι έχει χρησιμότητα! :upside:

Το πάλεψα αλλιώς τελικά, θυσιάζοντας το ordering. Η PDO library δίνει comumn reference με αριθμητικό index (0-based) εκτός από associative τρόπο.

$record = $statement->fetch()

$record[0] ειναι η πρώτη στήλη, $record[1] ειναι η 2η, κ.ο.κ.

Γινεται και full ότι ήθελα μεσω information schema αλλά θέλω να το κρατήσω as minimal and simple as possible.

SELECT * για όλα τα columns που έχει ένα table.Kαι μετά στο resultset ή dataset χρησιμοποιείς το ordinal position


<?php
$con=mysqli_connect("example.com","peter","abc123","my_db");
// Check connection
if (mysqli_connect_errno())
{
echo "Failed to connect to MySQL: " . mysqli_connect_error();
}

$result = mysqli_query($con,"SELECT * FROM Persons");

while($row = mysqli_fetch_array($result))
{
echo $row['FirstName'] . " " . $row['LastName'];
echo "<br>";
}

mysqli_close($con);
?>

Στο παραπάνω παράδειγμα αντι για αυτό

echo $row['FirstName'] . " " . $row['LastName'];

κάνεις αυτό

echo $row[0] . " " . $row[1];

Πιθανότατα να το κάνει με τον τρόπο που είπες, αλλά δε γνωρίζω SQLi/PDO για να σου πω. Η πιό απλή λύση, που δουλεύει ανεξαρτήτως γλώσσας είναι:

Select book_name as Col1, book_author as Col2 From table_books;

Έτσι, κάθε φορά διαβάζεις στον κώδικά σου τα πεδία Col1, Col2 άσχετα με τον πίνακα που παίρνεις δεδομένα.

O nucleus είπε σε SQLi αυτό που είπα πιο πριν σε PDO.

Wizard στο SQL σου χρησιμοποιείς ονόματα πεδίων κάτι το οποίο

δεν είναι γνωστό γιατί ο πίνακας περνιέται παραμετρικά.

θα βόλευε αν η SQL είχε κάτι σαν mytable.column[0] για να αναφερθείς στην πρώτη στήλη του πίνακα mytable.

Γενικά το πρόβλημα δεν είναι στην PHP καθώς PDO και SQLi καλύπτουν, εφόσον εκτελεστεί το query.

Το πρόβλημα είναι στο να διατυπώσεις ένα SQL ερώτημα για δεδομένο τύπο πινάκων, ξέροντας μόνο το όνομα του πίνακα.

Το πρόβλημα είναι στο να διατυπώσεις ένα SQL ερώτημα για δεδομένο τύπο πινάκων, ξέροντας μόνο το όνομα του πίνακα.

To θέμα είναι κάπως να αντιστοιχίσεις τα column names με ένα "index".

Μπορείς να κάνεις αυτό

SELECT column_name,ordinal_position

FROM information_schema.columns

WHERE table_schema='myDatabase' AND table_name='myTable'

Μετά βάλτα σε ένα array ή σε κάποια δομή του τύπου Key-Value πχ ordinal_positionToColumn_NameMapper με key το ordinal_position και value το column_name.

Μετά μπορείς να γράφεις τα sql statements σου με String.format ή συνένωση ή όποιον άλλον τρόπο θέλεις χρησιμοποιώντας κάτι αυτής της μορφής SELECT ordinal_positionToColumn_NameMapper[1] WHERE ordinal_positionToColumn_NameMapper[2] = 'test'.

Ναι, το είπα παραπάνω αυτό και το απέριψα.

Γινεται και full ότι ήθελα μεσω information schema αλλά θέλω να το κρατήσω as minimal and simple as possible.

....order by 2 :-O

Archived

This topic is now archived and is closed to further replies.

×
×
  • Δημιουργία...

Important Information

Ο ιστότοπος theLab.gr χρησιμοποιεί cookies για να διασφαλίσει την καλύτερη εμπειρία σας κατά την περιήγηση. Μπορείτε να προσαρμόσετε τις ρυθμίσεις των cookies σας , διαφορετικά θα υποθέσουμε ότι είστε εντάξει για να συνεχίσετε.