- Home
- Categorie
- Coding e Sistemistica
- PHP
- aiuto select
-
:D:D:D:D:D
Grazie mille oslino!
Pensavo di essere stato chiaro e invece no... porta pazienza.
Dunque ci provo ancora:
Mi servono gli ultimi 3 articoli in ordine cronologico dal più recente con visibile = si
per cui:
[TABLE="class: grid"]
[TD]**id
**[/TD]
[TD]**categoria_id
**[/TD]
[TD]**title
**[/TD]
[TD]**description
**[/TD]
[TD]**keywords
**[/TD]
[TD]**data
**[/TD]
[TD]**h1
**[/TD]
[TD]**h2
**[/TD]
[TD]**testo
**[/TD]
[TD]**visibile
**[/TD]
[/TR][TD]1[/TD]
[TD]1[/TD]
[TD]title 1[/TD]
[TD]description 1[/TD]
[TD]keywords[/TD]
[TD]17 Gennaio 2015[/TD]
[TD]Titolo 1[/TD]
[TD]Sottotitolo 1[/TD]
[TD]Testo 1[/TD]
[TD]si[/TD]
[/TR][TD]3
[/TD]
[TD]8[/TD]
[TD]title 3[/TD]
[TD]description 3[/TD]
[TD]keywords[/TD]
[TD]15 Gennaio 2015[/TD]
[TD]Titolo 3[/TD]
[TD]Sottotitolo 3[/TD]
[TD]Testo 3[/TD]
[TD]si[/TD]
[/TR][TD]4
[/TD]
[TD]6[/TD]
[TD]title 4[/TD]
[TD]description 4[/TD]
[TD]keywords[/TD]
[TD]14 Gennaio 2015[/TD]
[TD]Titolo 4[/TD]
[TD]Sottotitolo 4[/TD]
[TD]Testo 4[/TD]
[TD]si[/TD]
[/TR]
[/TABLE]per ognuno di questi articoli mi serve l'ultima foto inserita, quella con l'id più alto
per cui:
[TABLE="class: grid"]
[TD]**id
**[/TD]
[TD]**foto
**[/TD]
[TD]**id_articolo
**[/TD]
[/TR][TD]10
[/TD]
[TD]foto10.jpg[/TD]
[TD]1[/TD]
[/TR][TD]14
[/TD]
[TD]foto14.jpg[/TD]
[TD]4[/TD]
[/TR][TD]20
[/TD]
[TD]foto20.jpg[/TD]
[TD]3[/TD]
[/TR]
[/TABLE]poi combinare queste 2 tabelle, io necessito soltanto di h1, h2 e foto
per cui:
[TABLE="class: grid"]
[TD]h1
[/TD]
[TD]h2
[/TD]
[TD]foto
[/TD]
[/TR][TD]Titolo 1
[/TD]
[TD]Sottotitolo 1
[/TD]
[TD]foto10.jpg
[/TD]
[/TR][TD]Titolo 3
[/TD]
[TD]Sottotitolo 3
[/TD]
[TD]foto20.jpg
[/TD]
[/TR][TD]Titolo 4
[/TD]
[TD]Sottotitolo 4
[/TD]
[TD]foto14.jpg
[/TD]
[/TR]
[/TABLE]spero di essere stato più chiaro
ringrazio in anticipo tutticiao!
-
La butto lì...
SELECT h1, h2, foto FROM articoli, foto WHERE articoli.visibile ="si" AND articoli.id = foto.id_articolo DESC LIMIT 3
-
Ho ricostruito le tue tabelle.
[PHP]<?php
require_once'connect.php';
$query = "SELECT DISTINCT foto.id_articolo FROM foto, articoli WHERE articoli.visibile ='si' ORDER BY foto.id_articolo DESC LIMIT 3";
$a = $mysqli_query($conn, $query);
$c = mysqli_num_rows($a);
while($r = mysqli_fetch_array($a)){
$array[] = $r[0];
}
echo '<pre>'; // DEBUG
var_dump($array); // DEBUG
echo '</pre>'; // DEBUG
for($i=0; $i < $c; $i++){
$query2 = "SELECT foto.foto, articoli.h1, articoli.h2 FROM foto, articoli WHERE foto.id_articolo = '$array*' AND articoli.id = '$array*' ORDER BY foto.id DESC LIMIT 1";
echo $query2 . '<br />'; // DEBUG
$result = $mysqli_query($conn, $query2);
while($row = mysqli_fetch_array($result)){
echo $row['foto'] . ' ' . 'ciclo while ' . $i . '<br />';
echo $row['h1'] . ' ' . $row['h2'] . '<br />';
}
echo 'ciclo for ' . $i . '<br />'; // DEBUG
}
?>[/PHP]
Funziona.
Mi devi una pizza.
Ciao.
-
Grande Oslino!
appena ho tempo provo!
se capiti a vicenza volentieri per la pizza!
grazie ancora!
:D:D:D:D:D:D:D:D:D:D
-
Fammi sapere se va.
E non fare il furbo, la pizza me la devi anche se passi tu a Rimini!EDIT:
uhmmm... riguardando il mio codice ho il dubbio che non vada come dovrebbe... ci devo lavorare sopra... non posso perdermi una pizza gratis!!!
-
Prova con questo. E' abbastanza contorto e forse si poteva fare di meglio con qualche trucco da guru SQL.
Però se funziona aggiungi una birra... media... bionda. E dessert.
Grazie.
[PHP]
<?php
require_once'connect.php';
// recupero i singoli id_articolo delle foto
$query = "SELECT DISTINCT foto.id_articolo FROM foto ORDER BY id_articolo DESC";
$a = mysqli_query($conn, $query);
// metto ogni id_articolo in un array
while($r = mysqli_fetch_array($a)){
$array[] = $r[0];
}
echo '<pre>'; // DEBUG (eliminare)
var_dump($array); // DEBUG (eliminare)
echo '</pre>'; // DEBUG (eliminare)
$x = 0;
$i = 0;while($i <= count($array)-1){ // faccio un ciclo su tutti i valori dell'array. Il ciclo si ferma all'esaurimento dell'array o al recupero di 3 articoli (riga 29)...
$query2 = "SELECT foto.foto, h1, h2 FROM foto, articoli WHERE foto.id_articolo = '$array*' AND articoli.id = '$array*' AND articoli.visibile = 'si' ORDER BY foto.id DESC LIMIT 1"; echo $query2 . '<br />'; // DEBUG (eliminare) $result = mysqli_query($conn, $query2); $i++; // passo al valore successivo dell'array if(mysqli_num_rows($result) == 0) continue; // se con l'id_articolo non c'è un articolo "visibile" riprendo il ciclo da capo altrimenti proseguo... $x++; //... inserendo il primo articolo e aumentando il contatore while($row = mysqli_fetch_array($result)){ echo "<h1>Articolo $x </h1>"; // DEBUG (eliminare) echo $row['foto'] . '<br />'; echo $row['h1'] . ' ' . $row['h2'] . '<br />'; } if($x == 3) break; // quando il contatore degli articoli recuperati arriva a 3 mi fermo
}
?>
[/PHP]
Ricordati di mettere i vari die() e controlli di errore.
Ciao.
-
Ci provo anch'io... c'è in ballo una pizza...
Provata e funzionante,
per Mysql:SELECT * FROM ( SELECT A2.* FROM (SELECT ID FROM ARTICOLI WHERE ARTICOLI.visibile="si" ORDER BY DATA DESC LIMIT 3) A1, ARTICOLI A2 WHERE A1.ID=A2.ID ) A LEFT JOIN ( SELECT B2.* FROM (SELECT id_articolo, MAX(id) AS MAX_ID FROM FOTO GROUP BY ID_ARTICOLO) B1, FOTO B2 WHERE B1.MAX_ID=B2.ID ) B WHERE A.ID=B.ID_ARTICOLO
per MsAccess:
SELECT * FROM ( SELECT A2.* FROM (SELECT TOP 3 ID FROM ARTICOLI WHERE ARTICOLI.visibile="si" ORDER BY DATA DESC) A1, ARTICOLI A2 WHERE A1.ID=A2.ID ) A LEFT JOIN ( SELECT B2.* FROM (SELECT id_articolo, MAX(id) AS MAX_ID FROM FOTO GROUP BY ID_ARTICOLO) B1, FOTO B2 WHERE B1.MAX_ID=B2.ID ) B WHERE A.ID=B.ID_ARTICOLO
Ciao e alla prossima
-
Lasciamene una fetta...
-
Ragazzi devo mettere via i soldi per la cucina, non posso pagare pizze a tutti :D:D:D:D:D
Una domanda per OsteriaORistorante: vedo che nella query ci sono A1, A2, B1, B2
Perdonate l'ignoranza e la domanda forse molto banale, ma che cosa sono?
grazie ancora per le risposte
buona giornata a tutti
-
@enricocarli said:
Ragazzi devo mettere via i soldi per la cucina, non posso pagare pizze a tutti :D:D:D:D:D
Una domanda per OsteriaORistorante: vedo che nella query ci sono A1, A2, B1, B2
Perdonate l'ignoranza e la domanda forse molto banale, ma che cosa sono?
grazie ancora per le risposte
buona giornata a tuttiCiao Enrico,
A1, A2, B1, B2 sono gli alias delle tabelle o delle query, cerca "sql alias" su googleMichele
-
annn ho capito...
però mi da errore sul phpmyadmin:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE A.ID=B.ID_ARTICOLO' at line 13
forse è la mia versione di php?
bho!
-
Cmq sia...
ho quasi risolto; ho scritto:
SELECT * FROM articoli LEFT OUTER JOIN foto ON articoli.id=foto.id_articolo WHERE visibile = 'si' GROUP BY id_articolo ORDER BY data DESC LIMIT 0, 3;
l'unico problema è che non mi prende l'ultima foto, bensì la prima...
Il GROUP BY tiene buono il primo risultato, gli altri li esclude, che voi sappiate c'è il sistema per farlo funzionare al contrario?
grazie infinite a tutti
siete gentilissimi
buona serata
-
CORRETTO:
Ci provo anch'io... c'è in ballo una pizza...
Provata e funzionante,
per Mysql:SELECT * FROM ( SELECT A2.* FROM (SELECT ID FROM ARTICOLI WHERE ARTICOLI.visibile="si" ORDER BY DATA DESC LIMIT 3) A1, ARTICOLI A2 WHERE A1.ID=A2.ID ) A LEFT JOIN ( SELECT B2.* FROM (SELECT id_articolo, MAX(id) AS MAX_ID FROM FOTO GROUP BY ID_ARTICOLO) B1, FOTO B2 WHERE B1.MAX_ID=B2.ID ) B ON A.ID=B.ID_ARTICOLO
per MsAccess:
SELECT * FROM ( SELECT A2.* FROM (SELECT TOP 3 ID FROM ARTICOLI WHERE ARTICOLI.visibile="si" ORDER BY DATA DESC) A1, ARTICOLI A2 WHERE A1.ID=A2.ID ) A LEFT JOIN ( SELECT B2.* FROM (SELECT id_articolo, MAX(id) AS MAX_ID FROM FOTO GROUP BY ID_ARTICOLO) B1, FOTO B2 WHERE B1.MAX_ID=B2.ID ) B ON A.ID=B.ID_ARTICOLO
Ciao e alla prossima
-
:():
-
mi son dimenticato di indicare qual è la modifica.... "ON A.ID=B.ID_ARTICOLO" al posto di "WHERE A.ID=B.ID_ARTICOLO"
-
Ciao OsteriaORistorante!
ho scritto:
SELECT * FROM (
SELECT A2.* FROM
(SELECT ID
FROM ARTICOLI
WHERE ARTICOLI.visibile="si"
ORDER BY DATA DESC LIMIT 3) A1, ARTICOLI A2 ON A.ID=B.ID_ARTICOLO
) A LEFT JOIN (
SELECT B2.* FROM
(SELECT id_articolo, MAX(id) AS MAX_ID
FROM FOTO
GROUP BY ID_ARTICOLO) B1, FOTO B2
WHERE B1.MAX_ID=B2.ID
) B ON A.ID=B.ID_ARTICOLOma da errore:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'ON A.ID=B.ID_ARTICOLO ) A LEFT JOIN ( SELECT B2.* FROM (SELECT id_articolo, M' at line 6
ma tu hai provato con la mia query?
SELECT * FROM articoli LEFT OUTER JOIN foto ON articoli.id=foto.id_articolo WHERE visibile = 'si' GROUP BY id_articolo ORDER BY data DESC LIMIT 0, 3;
l'unico problema è che prende la prima foto e non l'ultima, colpa del GROUP BY se non sbaglio,
non si può dirgli in qualche modo "Ragruppa ma parti da in fondo"?
grazie mille a tutti
buona serata
-
@enricocarli said:
Ciao OsteriaORistorante!
[...]
ma da errore:#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'ON A.ID=B.ID_ARTICOLO ) A LEFT JOIN ( SELECT B2.* FROM (SELECT id_articolo, M' at line 6
[...]Vabbè... che dire... eeehhhhh... non tutte le ciambelle riescono col buco....
Prova questo...
[PHP]
<?php
require_once'connect.php';
// recupero i singoli id_articolo delle foto
$query = "SELECT DISTINCT foto.id_articolo FROM foto ORDER BY id_articolo DESC";
$a = mysqli_query($conn, $query);
// metto ogni id_articolo in un array
while($r = mysqli_fetch_array($a)){
$array[] = $r[0];
}
echo '<pre>'; // DEBUG (eliminare)
var_dump($array); // DEBUG (eliminare)
echo '</pre>'; // DEBUG (eliminare)
$x = 0;
$i = 0;while($i <= count($array)-1){ // faccio un ciclo su tutti i valori dell'array. Il ciclo si ferma all'esaurimento dell'array o al recupero di 3 articoli (riga 29)...
$query2 = "SELECT foto.foto, h1, h2 FROM foto, articoli WHERE foto.id_articolo = '$array*' AND articoli.id = '$array*' AND articoli.visibile = 'si' ORDER BY foto.id DESC LIMIT 1"; echo $query2 . '<br />'; // DEBUG (eliminare) $result = mysqli_query($conn, $query2); $i++; // passo al valore successivo dell'array if(mysqli_num_rows($result) == 0) continue; // se con l'id_articolo non c'è un articolo "visibile" riprendo il ciclo da capo altrimenti proseguo... $x++; //... inserendo il primo articolo e aumentando il contatore while($row = mysqli_fetch_array($result)){ echo "<h1>Articolo $x </h1>"; // DEBUG (eliminare) echo $row['foto'] . '<br />'; echo $row['h1'] . ' ' . $row['h2'] . '<br />'; } if($x == 3) break; // quando il contatore degli articoli recuperati arriva a 3 mi fermo
}
?>
[/PHP]
Tonno e cipolla... grazie.
-
Ciao Enrico,
tonno e cipolla non mi interessano... ma giusto per verifica, mi sembra che la query che hai eseguito tu rispetto a quella che ti ho indicato io, è diversa nella parte evidenziata..... mi sbaglio?quella da me indicata:
SELECT * FROM (
SELECT A2.* FROM
(SELECT ID
FROM ARTICOLI
WHERE ARTICOLI.visibile="si"
ORDER BY DATA DESC LIMIT 3) A1, ARTICOLI A2** WHERE A1.ID=A2.ID**
) A LEFT JOIN (
SELECT B2.* FROM
(SELECT id_articolo, MAX(id) AS MAX_ID
FROM FOTO
GROUP BY ID_ARTICOLO) B1, FOTO B2
WHERE B1.MAX_ID=B2.ID
) B ON A.ID=B.ID_ARTICOLOQuella da te eseguita:
SELECT * FROM (
SELECT A2.* FROM
(SELECT ID
FROM ARTICOLI
WHERE ARTICOLI.visibile="si"
ORDER BY DATA DESC LIMIT 3) A1, ARTICOLI A2** ON A.ID=B.ID_ARTICOLO**
) A LEFT JOIN (
SELECT B2.* FROM
(SELECT id_articolo, MAX(id) AS MAX_ID
FROM FOTO
GROUP BY ID_ARTICOLO) B1, FOTO B2
WHERE B1.MAX_ID=B2.ID
) B ON A.ID=B.ID_ARTICOLOriprova, sarai più fortunato.... e ahimè.. Oslino più sfortunato
Ciaue
-
cheddire...
molto bravi tutti e 2, complimenti davvero...
se posso fare delle considerazioni, da principiante profano e impedito di php,
è veramente interessante come con una query si possano incrociare dati e manipolarli così,
parlo della query di OsteriaORistorante, che per quello che ne so io è veramente complessa...
però sinceramente non ho capito come funziona, e non ho capito il discorso degli alias; me li puoi spiegare?
Anche la soluzione di Oslino fa quello che deve fare è capisco a spanne come funziona, bravo Oslino!
Grazie a tutti e 2 per la pazienza e il tempo dedicatomi,
se capito a Milano o Rimini o capitate voi a Vicenza ve la offro la pizza :D:D:D:D:D
Un ultima domanda... ma secondo voi tra le 2 qual'è la soluzione migliore?
grazie ancora e buonanotte
-
@enricocarli said:
Un ultima domanda... ma secondo voi tra le 2 qual'è la soluzione migliore?
Che domande... la migliore è sempre quella che fa la stessa cosa con minor codice (e sfruttando le caratteristiche intrinseche del linguaggio).
Ne guadagna anche la velocità di esecuzione e quindi la performance generale.