1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

Verknüpfungstabelle mit SELECT GROUP_CONCAT ausgeben

Dieses Thema im Forum "PHP" wurde erstellt von print147, 21. April 2012.

  1. print147

    print147 Grünschnabel

    Hallo zusammen,

    Ich möchte die Spalte optID der im Anhang zu findenden Verknüpfungstabelle mit Hilfe von group_concat ausgeben.
    verknuepfungstabelle.gif
    Die Tabelle zeigt auf, welche Dimensionen (Farben und Größen) und Merkmalsausprägungen (rot, blau, gelb, small, medium, large) an den einzelnen Artikelvarianten (Spalte combiOptID) beteiligt sind. Die Spalte combiOptGrID faßt die erzeugten Artikelvarianten unter einer ID und einem Namen (z.B. T-Shirt) zusammen. Kombiniert wurden die Farben 3=rot, 4=blau und die Größen (6=small, 7=medium und 8=large).

    PHP:
    1. $values = array( array( '3', '4' ), array( '6', '7', '8' ));
    2. $valuesText = array( array( 'rot', 'blau' ), array( 'small', 'medium', 'large' ));
    3. Ich habe es mit folgender Query versucht:
    4. $sqlB    =   "   SELECT ";
    5. $sqlB    .=  "   GROUP_CONCAT($optCombiRel.optID SEPARATOR ' - ') as optID";
    6. $sqlB    .=  "   FROM $optCombiRel ";
    7. $sqlB    .=  "   WHERE $optCombiRel.combiOptGrID = 9 ";
    8. $sqlB    .=  "   GROUP BY $optCombiRel.combiOptID ";
    9. $resB    =   mysql_query($sqlB) or die(mysql_error());
    10. $numB    =   mysql_num_rows($resB);
    11. echo "numB: ".$numB."<br>";
    12. $r=1;
    13. while($rows = mysql_fetch_array($resB))
    14. {
    15. echo $r.":  ".$rows['optID']."<br>";
    16. $r++;
    17. }
    18. numB: 6
    19. 1: 3 - 6
    20. 2: 3 - 7
    21. 3: 3 - 8
    22. [B]4: 6 - 4[/B]
    23. 5: 4 - 7
    24. 6: 48
    25. Er vertauscht hier jedoch Farbe und Größe:
    26.  
    27.  
    Ich hoffe, Ihr könnt mir weiterhelfen. Vielen Dank im voraus!
  2. einfach nur crack

    einfach nur crack mag Cookies & Kekse

    Hast du es schon mit ORDER BY versucht?
  3. print147

    print147 Grünschnabel

    Ja, aber trotz ORDER BY bleibt der Fehler in Zeile 4 der Ausgabe weiter erhalten.
  4. Yaslaw

    Yaslaw n/a Moderator

    Was für ein Fehler?

    Dein SQL sieht grundsätzlich sauber aus.
    Nur habe ich a) nicht verstanden was du genau haben willst, b) was für ein Fehler auftritt und c) welches diese Zeile 4 ist.

    Code (SQL):
    1. -- Dein SQL, zur besseren lesbarkeit mal aus dem PHP extrahiert.
    2. SELECT
    3.     GROUP_CONCAT(optID SEPARATOR ' - ') AS optID
    4. FROM
    5.     {$optCombiRel}
    6. WHERE
    7.     combiOptGrID = 9
    8. GROUP BY
    9.     combiOptID
    Die combiOptID, nach welcher du gruppiertst würde ich auch noch in den SELECT nehmen um anzuzeigen zu welchem combiOptID die Zeile gehört.
    Zuletzt von einem Moderator bearbeitet: 23. Mai 2014
  5. print147

    print147 Grünschnabel

    Schön, daß noch jemand zu dem Thema Stellung nimmt.
    Wo liegt der Fehler?
    numB: 6
    1: 3 – 6 ( rot – small)
    2: 3 – 7 ( rot – medium)
    3: 3 – 8 ( rot – large)
    4: 6 - 4 (small – blau)
    5: 4 – 7 (blau – medium)
    6: 4 – 8 (blau –large)
    Meine Group-Concat-Query erzeugt mir folgende sechs Kombinationen von Farbe und Größe eines T-Shirts (combiOptGrID). Diese T-Shirt-Varianten sind in der obigen Verknüpfungstabelle untereinander aufgelistet (für jede Farbe und jede Größe ein separater Datensatz). So können später dem T-Shirt problemlos neue Kombinationen hinzugefügt werden. Fehler: 4: 6 - 4 (small – blau).

    Was möchte ich erreichen:
    Ich möchte aus der Verknüpfungstabelle eine Ergebnistabelle erzeugen. Diese zeigt auf, welche Varianten zu den einzelnen Kombigruppen gehören und aus welchen Merkmalen und Merkmalsausprägungen jede Variante besteht Durch Anklicken des Icons in der Spalte Update oder Delete kann der Anwender gezielt ein Variante(Kombination) ändern oder löschen. Die Zahlenwerte oder IDs brauche ich lediglich zur Konstruktion der Image-Links. Der Anwender sieht nur die Nicht-Zahlenwerte. Eine Combi kann aus beliebig vielen Dimensionen und Ausprägungen bestehen.
    combi_options_tabelle.png
    Da ich mit GROUP_CONCAT nicht weitergekommen bin, habe ich das Control-Panel über Queries und multidimensionale Arrays erzeugt. So kann ich auf die einzelnen Paramter einer Combi gezielt zugreifen und auch doppelte Spalten ausblenden.
    Die Lösung erfüllt zwar ihren Zweck, aber sicherlich kann man das auch eleganter lösen. Vielleicht kann mal ein kluger Kopf einen Blick auf die Queries und Arrays werfen.

    Der Quellcode befindet sich in der Textdatei. Ebenso im Anhang: die mit dem Code erzeugte Ergebnistabelle. Bei Bedarf kann ich auch noch die beteiligten Datenbanktabellen und Verknüpfungen grafisch oder als sql-Datei liefern. Vielen Dank im voraus für Eure konstruktive Kritik.

    Anhänge:

  6. Yaslaw

    Yaslaw n/a Moderator

    item: Und was ist an '4: 6 - 4 (small – blau)' Falsch? Was müsste denn da stehen?

    item: In deiner combi_options_tabelle hast du viele Spalten ohne Namen.
    a) Ist diese Tabelle ein IST oder SOLL Zustand?
    b) Was sind das für Spalten (Bezeichnung plus was es sein soll. Also id1 und id2 sind nciht hilfreich)

    item: Es sit schwer zu sagen was da wie läuft wenn einem die Basis fehlt. Für dich mag so manches klar sein, für mich gar nicht. Ich sehe nur Nummern und eine Angabe das da eine Nummer falsch ist. Um zu sagen wie ein SQL aussehen soll, muss man die Datenbankstruktur kennen.

    Am besten machst du mal Datenbeispiel mit Tabellen. So in der Art:
    item: Ein Tipp zu deinen SQL-Statements in PHP. Arbeite mit Tabellenalias. Es wird viel lesbarer wenn du die Tabellennamenvariable nur einmal einsetzen musst

    item: Tipp 2. mMn wird es mit den folgenden 2 Punkten noch lesbarer.... (Ist aber wie immer bei solchen Sachen geschmacksache)
    a) den SQL-Teil in PHP formatieren: Heredoc-Syntax
    b) Die Complex (Curly) Syntax anwenden um die Strings zusammenzusetzen.

    Code (PHP):
    1. $sqlC0   = <<<SQL
    2. SELECT DISTINCT
    3.     ocr.combiOptGrID,
    4.     ocr.combiOptID,
    5.     ogd.optGrName
    6. FROM
    7.     {$optCombiRel}  AS ocr,
    8.     {$optGroupDescr}    AS ogd
    9. WHERE
    10.     ocr.combiOptGRID         = ogd.optGrID
    11.     AND ogd.language_id   = 4
    12. ORDER BY
    13.     ocr.combiOptGrID ASC;
    14. SQL;
  7. print147

    print147 Grünschnabel

    Richtig wäre: 4: 4 – 6 (blau –small)

    a) Soll-Zustand
    b) Nachfolgend Tabelle mit Legende

    combi_options_table_2.png

    Stimmt. Anbei Tabellendiagramm und die DB-Struktur sowie die Datei option_combi_panel_inc5b2.txt.
    Code (Text):
    1.  
    2. -- phpMyAdmin SQL Dump
    3. -- version 3.4.5
    4. -- http://www.phpmyadmin.net
    5. --
    6. -- Host: localhost
    7. -- Erstellungszeit: 26. Apr 2012 um 21:11
    8. -- Server Version: 5.5.16
    9. -- PHP-Version: 5.3.8
    10.  
    11. SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
    12. SET time_zone = "+00:00";
    13.  
    14.  
    15. /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
    16. /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
    17. /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
    18. /*!40101 SET NAMES utf8 */;
    19.  
    20. --
    21. -- Datenbank: `y1_multishop`
    22. --
    23.  
    24. -- --------------------------------------------------------
    25.  
    26. --
    27. -- Tabellenstruktur für Tabelle `optiongroup`
    28. --
    29.  
    30. CREATE TABLE IF NOT EXISTS `optiongroup` (
    31.   `optGrID` int(11) NOT NULL AUTO_INCREMENT,
    32.   `optGrForCombi` int(11) DEFAULT NULL,
    33.   PRIMARY KEY (`optGrID`)
    34. ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=11 ;
    35.  
    36. --
    37. -- Daten für Tabelle `optiongroup`
    38. --
    39.  
    40. INSERT INTO `optiongroup` (`optGrID`, `optGrForCombi`) VALUES
    41. (1, 0),
    42. (2, 0),
    43. (3, 0),
    44. (4, 0),
    45. (6, 1),
    46. (7, 1),
    47. (8, 1),
    48. (9, 2),
    49. (10, 2);
    50.  
    51. -- --------------------------------------------------------
    52.  
    53. --
    54. -- Tabellenstruktur für Tabelle `optiongroup_description`
    55. --
    56.  
    57. CREATE TABLE IF NOT EXISTS `optiongroup_description` (
    58.   `optGrID` int(11) DEFAULT NULL,
    59.   `language_id` int(11) DEFAULT NULL,
    60.   `optGrName` varchar(30) DEFAULT NULL
    61. ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
    62.  
    63. --
    64. -- Daten für Tabelle `optiongroup_description`
    65. --
    66.  
    67. INSERT INTO `optiongroup_description` (`optGrID`, `language_id`, `optGrName`) VALUES
    68. (1, 4, 'Lizenz_de'),
    69. (1, 5, 'Lizenz_en'),
    70. (2, 4, 'Templates'),
    71. (2, 5, 'Templates'),
    72. (3, 4, 'Copyrightvermerk entfernen'),
    73. (3, 5, 'Remove Copyright'),
    74. (4, 4, 'Versand auf CD / DVD'),
    75. (4, 5, 'Shipping on CD / DVD'),
    76. (6, 4, 'Farbe'),
    77. (6, 5, 'Colour'),
    78. (7, 4, 'Größe'),
    79. (7, 5, 'Size'),
    80. (8, 4, 'Material'),
    81. (8, 5, 'Material'),
    82. (9, 4, 'T-Shirt'),
    83. (9, 5, 'T-Shirt'),
    84. (10, 4, 'Combi II'),
    85. (10, 5, 'Combi_en');
    86.  
    87. -- --------------------------------------------------------
    88.  
    89. --
    90. -- Tabellenstruktur für Tabelle `optiongroup_to_option`
    91. --
    92.  
    93. CREATE TABLE IF NOT EXISTS `optiongroup_to_option` (
    94.   `optGrID` int(11) DEFAULT NULL,
    95.   `optID` int(11) DEFAULT NULL
    96. ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
    97.  
    98. --
    99. -- Daten für Tabelle `optiongroup_to_option`
    100. --
    101.  
    102. INSERT INTO `optiongroup_to_option` (`optGrID`, `optID`) VALUES
    103. (1, 1),
    104. (2, 1),
    105. (3, 1),
    106. (4, 1),
    107. (1, 2),
    108. (6, 3),
    109. (6, 4),
    110. (6, 5),
    111. (7, 6),
    112. (7, 7),
    113. (7, 8),
    114. (8, 9),
    115. (8, 10),
    116. (6, 11),
    117. (6, 12);
    118.  
    119. -- --------------------------------------------------------
    120.  
    121. --
    122. -- Tabellenstruktur für Tabelle `options`
    123. --
    124.  
    125. CREATE TABLE IF NOT EXISTS `options` (
    126.   `optID` int(11) NOT NULL AUTO_INCREMENT,
    127.   `optForCombi` int(11) DEFAULT NULL,
    128.   PRIMARY KEY (`optID`)
    129. ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=13 ;
    130.  
    131. --
    132. -- Daten für Tabelle `options`
    133. --
    134.  
    135. INSERT INTO `options` (`optID`, `optForCombi`) VALUES
    136. (1, 1),
    137. (2, 1),
    138. (3, 1),
    139. (4, 1),
    140. (5, 0),
    141. (6, 1),
    142. (7, 1),
    143. (8, 1),
    144. (9, 1),
    145. (10, 1),
    146. (11, 0),
    147. (12, 0);
    148.  
    149. -- --------------------------------------------------------
    150.  
    151. --
    152. -- Tabellenstruktur für Tabelle `option_combis`
    153. --
    154.  
    155. CREATE TABLE IF NOT EXISTS `option_combis` (
    156.   `combiOptID` int(11) NOT NULL AUTO_INCREMENT,
    157.   PRIMARY KEY (`combiOptID`)
    158. ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=19 ;
    159.  
    160. --
    161. -- Daten für Tabelle `option_combis`
    162. --
    163.  
    164. INSERT INTO `option_combis` (`combiOptID`) VALUES
    165. (1),
    166. (2),
    167. (3),
    168. (4),
    169. (5),
    170. (6),
    171. (7),
    172. (8),
    173. (9),
    174. (10),
    175. (11),
    176. (12),
    177. (13),
    178. (14),
    179. (15),
    180. (16),
    181. (17),
    182. (18);
    183.  
    184. -- --------------------------------------------------------
    185.  
    186. --
    187. -- Tabellenstruktur für Tabelle `option_combi_relations`
    188. --
    189.  
    190. CREATE TABLE IF NOT EXISTS `option_combi_relations` (
    191.   `combiOptGrID` int(11) DEFAULT NULL,
    192.   `combiOptID` int(11) DEFAULT NULL,
    193.   `optGrID` int(11) DEFAULT NULL,
    194.   `optID` int(11) DEFAULT NULL
    195. ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
    196.  
    197. --
    198. -- Daten für Tabelle `option_combi_relations`
    199. --
    200.  
    201. INSERT INTO `option_combi_relations` (`combiOptGrID`, `combiOptID`, `optGrID`, `optID`) VALUES
    202. (9, 1, 6, 3),
    203. (9, 1, 7, 6),
    204. (9, 2, 6, 3),
    205. (9, 2, 7, 7),
    206. (9, 3, 6, 3),
    207. (9, 3, 7, 8),
    208. (9, 4, 6, 4),
    209. (9, 4, 7, 6),
    210. (9, 5, 6, 4),
    211. (9, 5, 7, 7),
    212. (9, 6, 6, 4),
    213. (9, 6, 7, 8),
    214. (10, 7, 6, 3),
    215. (10, 7, 7, 6),
    216. (10, 7, 8, 9),
    217. (10, 8, 6, 3),
    218. (10, 8, 7, 6),
    219. (10, 8, 8, 10),
    220. (10, 9, 6, 3),
    221. (10, 9, 7, 7),
    222. (10, 9, 8, 9),
    223. (10, 10, 6, 3),
    224. (10, 10, 7, 7),
    225. (10, 10, 8, 10),
    226. (10, 11, 6, 3),
    227. (10, 11, 7, 8),
    228. (10, 11, 8, 9),
    229. (10, 12, 6, 3),
    230. (10, 12, 7, 8),
    231. (10, 12, 8, 10),
    232. (10, 13, 6, 4),
    233. (10, 13, 7, 6),
    234. (10, 13, 8, 9),
    235. (10, 14, 6, 4),
    236. (10, 14, 7, 6),
    237. (10, 14, 8, 10),
    238. (10, 15, 6, 4),
    239. (10, 15, 7, 7),
    240. (10, 15, 8, 9),
    241. (10, 16, 6, 4),
    242. (10, 16, 7, 7),
    243. (10, 16, 8, 10),
    244. (10, 17, 6, 4),
    245. (10, 17, 7, 8),
    246. (10, 17, 8, 9),
    247. (10, 18, 6, 4),
    248. (10, 18, 7, 8),
    249. (10, 18, 8, 10);
    250.  
    251. -- --------------------------------------------------------
    252.  
    253. --
    254. -- Tabellenstruktur für Tabelle `option_description`
    255. --
    256.  
    257. CREATE TABLE IF NOT EXISTS `option_description` (
    258.   `optID` int(11) DEFAULT NULL,
    259.   `language_id` int(11) DEFAULT NULL,
    260.   `optName` varchar(30) DEFAULT NULL
    261. ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
    262.  
    263. --
    264. -- Daten für Tabelle `option_description`
    265. --
    266.  
    267. INSERT INTO `option_description` (`optID`, `language_id`, `optName`) VALUES
    268. (1, 4, 'nicht notwendig'),
    269. (1, 5, 'not required'),
    270. (2, 4, 'EPL-Lizenz'),
    271. (2, 5, 'EPL License'),
    272. (3, 4, 'rot'),
    273. (3, 5, 'red'),
    274. (4, 4, 'blau'),
    275. (4, 5, 'blue'),
    276. (5, 4, 'gelb'),
    277. (5, 5, 'yellow'),
    278. (6, 4, 'small'),
    279. (6, 5, 'small'),
    280. (7, 4, 'medium'),
    281. (7, 5, 'medium'),
    282. (8, 4, 'large'),
    283. (8, 5, 'large'),
    284. (9, 4, '100% Baumwolle'),
    285. (9, 5, '100% Cotton'),
    286. (10, 4, '80% Bamwolle'),
    287. (10, 5, '80% Cotton'),
    288. (11, 4, 'schwarz'),
    289. (11, 5, 'black'),
    290. (12, 4, 'wei&szlig;'),
    291. (12, 5, 'white');
    292.  
    293. /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
    294. /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
    295. /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
    296.  
    Kurze Erklärung zu den Tabellen:
    optiongroup und optiongroup_description.
    Anlegen der Optionsgruppen und CombiOptionsgruppen in den Tabellen optiongroup und optiongroup_description. Die Spalte optGrForCombi hat folgende Bedeutung:
    0 = diese Optionsgruppe kann nicht mit einer anderen Optionsgruppe kombiniert werden
    1 = diese Optionsgruppe darf mit beliebig vielen Optionsgruppen kombiniert werden.
    2 = Name der Kombi-Optionsgruppe (z.B. T-Shirt, Combi-II).

    Options, options_description und optiongroup_to_option
    Anlegen der Merkmalsausprägungen (Options) in verschiedenen Sprachen. Über die Spalte optForCombi kann gesteuert werden, welche Optionen kombiniert werden dürfen (1) und welche nicht (0).
    In der Tabelle optiongroup_to_option wird jede Option einer oder mehreren Optionsgruppen zugeordnet.
    Option_combis und option_combi_relations
    In der Tabelle option_combis wird die ID einer Variante eingetragen, die durch Kombination von zwei oder mehreren Optionsgruppen und deren Merkmalsausprägungen erzeugt wurde. Die Tabelle option_combi_relations zeigt auf, aus welchen Optionsgruppen und Merkmalsausprägungen eine Variante besteht.

    Anhänge:

    Zuletzt bearbeitet: 26. April 2012
  8. Yaslaw

    Yaslaw n/a Moderator

    Jetzt versteh ich mehr oder minder worum es geht. Ist glaub nicht so kpmpliziert wie ich dachte.

    Ist es immer Aufsteigend nach der optID? Wenn ja, kann men in GROUP_CONCAT eine ORDER BY mitgeben.
    Code (SQL):
    1. SELECT
    2.     ocr.combiOptID,
    3.     GROUP_CONCAT(ocr.optID ORDER BY ocr.optID SEPARATOR ' - ') AS optIDs,
    4.     -- Du kannst auch ein anderes Feld auswählen und nach der optID sortieren
    5.     GROUP_CONCAT(od.optName ORDER BY ocr.optID SEPARATOR ' - ') AS optNames
    6. FROM
    7.     option_combi_relations ocr
    8.     INNER JOIN option_description od
    9.           ON ocr.optID = od.optID
    10. WHERE
    11.     ocr.combiOptGrID = 9
    12.     AND od.language_id = 4
    13. GROUP BY
    14.     ocr.combiOptID
    Code (Text):
    1. | combiOptID | optIDs | optNames       |
    2. ----------------------------------------
    3. |          1 | 3 - 6  | rot - small    |
    4. |          2 | 3 - 7  | rot - medium   |
    5. |          3 | 3 - 8  | rot - large    |
    6. |          4 | 4 - 6  | blau - small   |
    7. |          5 | 4 - 7  | blau - medium  |
    8. |          6 | 4 - 8  | blau - large   |
    Zuletzt von einem Moderator bearbeitet: 23. Mai 2014
  9. print147

    print147 Grünschnabel

    Yaslaw, nochmals Danke für Deinen Lösungsvorschlag. Habe ihn angepaßt. Funktioniert prima.

Diese Seite empfehlen